上篇我们讲解了Linq To Entities的一些基本操作,这篇我们主要是讲解一些比较高级的东西:存储过程查询,SQL语句查询以及表达式树。

存储过程

首先来讲解存储过程查询。

   //Query a stored procedure.(查询存储过程)
var tenExpensiveP = from p in nWEntities.Ten_Most_Expensive_Products()
select p;
foreach (var product in tenExpensiveP)
{
Console.WriteLine("Stored Procedure scenario: ProductName:{0},Price:{1}", product.TenMostExpensiveProducts, product.UnitPrice);
}
Console.WriteLine("=============================================");

在存储过程这块,我们首先需要做的是导入数据库中的存储过程对象。步骤如下:

1.双击Northwind.edmx,在左边的空白处右击,选择“从数据库更新模型”。

2.在弹出的“更新向导”窗口中,选中自己需要添加的存储过程:Ten_Most_Expensive_Products,之后点击完成按钮。

3.在左边的空白处右击,选择”添加“->”函数导入”,在弹出的”添加函数导入“对话框中,”函数导入名称“填写Ten_Most_Expensive_Products,然后在下面的”存储过程名称”中,下拉选择“Ten_Most_Expensive_Products”。之后点击“获取列信息”,可以看到返回的列已经显示在了下面的列表中。然后单击“创建新的复杂类型”按钮,则“复杂”单选框被激活,并且其后的文本框中自动会填充“Ten_Most_Expensive_Products”文本。做好这一切之后,点击“确定”按钮即可。

4.步骤3操作完毕后,Ten_Most_Expensive_Products实体类就被添加到了项目中,我们可以像操作其他实体类一样操作这个存储过程。

预编译查询

之后我们需要提到的是预编译查询。预编译查询主要是用于多个相似的查询存在的情况下,比如我在同一张表中第一次查询张三,第二次查询李四,那么我不必分两次去数据库拿数据,只要通过预编译查询,一次把所有需要的数据提取出来即可。

 //Compiled Query
//如果相同的查询操作在许多地方被使用,那么可以提前编译好需要执行的查询操作,然后在多个地方使用,可以提高Performance
Func<NorthWindEntities, string, IQueryable<Product>> func =
              CompiledQuery.Compile((NorthWindEntities NW, string category) =>from p in NW.Products where p.Category.CategoryName == category select p);
var product1 = func(nWEntities, "Beverages");
Console.WriteLine("Compiled query scenario: Total Products in category Beverages:{0}", product1.Count());
var product2 = func(nWEntities, "Seafood");
Console.WriteLine("Compiled query scenario: Total Products in category Seafood: {0}",product2.Count());
Console.WriteLine("=============================================");
其实上面你的代码只查询了数据库一次,但是可以在两个地方使用。
 

直接执行SQL语句

这里我们需要说到的是怎么在Linq to entities中执行sql语句。有时候当sql过于复杂的时候,我们完全可以利用原生的sql语句来查询。
//Direct SQL(直接是用SQL语句)
var products = nWEntities.ExecuteStoreQuery<Product>("SELECT * FROM Products WHERE Discontinued = 0 ORDER BY ProductName;");
Console.WriteLine("Direct SQL: Total discontinued products :{0}", products.Count()); int rowCount = nWEntities.ExecuteStoreCommand(" update products set UnitPrice=UnitPrice+1 where productID=35 ");
if (rowCount < 1) Console.WriteLine("Direct SQL: No product is updated.");
if (rowCount >= 1) Console.WriteLine("Direct SQL: Product is updated.");
Console.WriteLine("=============================================");

这里有两个方法:ExecuteStoreQuery用于提供查询操作;ExecuteStoreCommand用于提供执行操作。

 

表达式树

接下来是表达式树的说明,由于这个涉及的范围比较广,暂时先略过讲解,待之后慢慢研究:

//Expression Tree(表达式树)
ParameterExpression param = Expression.Parameter(typeof(Product),"p");
Expression left = Expression.Property(param,typeof(Product).GetProperty("UnitPrice"));
Expression right = Expression.Constant((decimal)100, typeof(Nullable<decimal>));
Expression filter = Expression.GreaterThanOrEqual(left,right);
Expression pred = Expression.Lambda(filter,param);
Console.WriteLine(pred.ToString()); //输出 p=>(p.UnitPrice>=100) IQueryable productList = nWEntities.Products;
Expression expr = Expression.Call(typeof(Queryable)
, "Where"
, new Type[] { typeof(Product)}
, Expression.Constant(productList)
, pred);
expr = Expression.Call(typeof(Queryable)
, "OrderBy"
, new Type[] { typeof(Product), typeof(string) }
, expr
, Expression.Lambda(Expression.Property(param, "ProductName"), param));
Console.WriteLine(expr.ToString()); IQueryable<Product> query = nWEntities.Products.AsQueryable().Provider.CreateQuery<Product>(expr);
foreach (var p in query)
{
Console.WriteLine("Expression Tree scenario: Product name: {0}",p.ProductName);
}
Console.WriteLine("=============================================");
推荐看以下文章:
 

带参动态查询

最后说到的是带参的动态查询:
  //Dynamic Query with parameters(带参的动态查询)
string querystring = "select value product from NorthwindEntities.Products as Product where Product.ProductID = @id";
ObjectQuery<Product> productQuery = new ObjectQuery<Product>(querystring, nWEntities);
productQuery.Parameters.Add(new ObjectParameter("id", 1));
foreach (var p in productQuery)
{
Console.WriteLine("Dynamic query with parameters: ProductName {0}",p.ProductName);
}

这里我们可以利用ObjectQuery的Parameters属性动态添加参数。

Linq To Entities 及其相关(进阶)的更多相关文章

  1. Linq To Entities 及其相关

    说到Linq,很多人都非常熟悉,我们可以很方便的用它来操纵对象的集合.今天要说的是Linq To Entities及其相关的操作.下面一步一步的来进行.这里我着重强调的是语法上面的一些注意点.所以怎么 ...

  2. LINQ to Entities 查询语法

    转自: http://www.cnblogs.com/asingna/archive/2013/01/28/2879595.html 实体框架(Entity Framework )是 ADO.NET  ...

  3. LINQ(LINQ to Entities)

    LINQ to Entities 是 LINQ 中最吸引人的部分.它让你可以使用标准的 C# 对象与数据库的结构和数据打交道.使用 LINQ to Entities 时,LINQ 查询在后台转换为 S ...

  4. C#_LINQ(LINQ to Entities)

    LINQ to Entities 是 LINQ 中最吸引人的部分.它让你可以使用标准的 C# 对象与数据库的结构和数据打交道.使用 LINQ to Entities 时,LINQ 查询在后台转换为 S ...

  5. LINQ to Entities 查询中的标准查询运算符

    投影和筛选方法 投影指的是转换的结果集到所需的窗体中的元素. 例如,可以从结果集中的每个对象投影所需的属性子集,可以投影一个属性并对其执行数学计算,也可以从结果集投影整个对象. 投影方法有 Selec ...

  6. LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”

    我就不屁话,能一张图就解决的就不说话了 2015-03-28 14:53:24,440 [10] ERROR log - System.NotSupportedException: LINQ to E ...

  7. 【转】Entity Framework技术系列之7:LINQ to Entities

    前言 LINQ(Language Integrated Query,语言集成查询)是一组用于C#和VB.NET语言的扩展,它允许编写C#或者VB.NET代码,以与查询数据库相同的方式操作内存数据. L ...

  8. mvc ef LINQ to Entities 不识别方法“Int32 Parse(System.String)”,因此该方法无法转换为存储表达式。

    private sys_User GetUserInfo() { sys_User model = null; var userId = Convert.ToInt32(AccountHelper.G ...

  9. Linq to entities 学习笔记

    Linq to  entities ---提供语言集成查询支持用于在概念模型中定义的实体类型. 首先可以根据http://msdn.microsoft.com/en-us/data/jj206878该 ...

随机推荐

  1. Android直方图递增View

    继上次分析实现Android自定义View之扇形图之后,自己又画了下面的这个递增直方图,本来是想做个静态的直方图就完了,结果想想静态的没啥趣味,于是就加了递增 1 从分析最终效果 界面上要展现的东西有 ...

  2. UISearchBar改变搜索框的高度

    系统的searchBar UISearchBar的中子控件及其布局 UIView(直接子控件) frame 等于 searchBar的bounds,view的子控件及其布局 UISearchBarBa ...

  3. 多线程基础(五)NSThread线程通信

    5.多线程基础 线程间通信   什么叫线程间通信 在一个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信   线程间通信的体现 1个线程传递数据给另一个线程 在1个线程中执行完特定任务后, ...

  4. Effective Java 24 Eliminate unchecked warnings

    Note Eliminate every unchecked warning that you can. Set<Lark> exaltation = new HashSet(); The ...

  5. Force.com平台基础--前言

    云计算平台 云计算模式有三种:(下面介绍来自百科) 1. SaaS:提供给客户的服务是运营商运行在云计算基础设施上的应用程序,用户可以在各种设备上通过客户端界面访问,如浏览器.消费者不需要管理或控制任 ...

  6. LightSpeed 相关问题处理

    1. 关于KeyTable 配置文件中有一个节点 lightSpeedContexts  该节点下存放的是一些使用LightSpeed的配置,如 <add name="myDB&quo ...

  7. yum命令不能使用的相关错误

    使用yum安装软件时,出现下面报错 [root@localhost ~]# yum install -y lrzszLoaded plugins: fastestmirror, securityLoa ...

  8. [分享]一个String工具类,也许你的项目中会用得到

    每次做项目都会遇到字符串的处理,每次都会去写一个StringUtil,完成一些功能. 但其实每次要的功能都差不多: 1.判断类(包括NULL和空串.是否是空白字符串等) 2.默认值 3.去空白(tri ...

  9. spring ioc DI 理解

    下面是我从网上找来的一些大牛对spring ioc和DI的理解,希望也能让你对Spring ioc和DI的设计思想有更进一步的认识. 一.分享Iteye的开涛对Ioc的精彩讲解 Ioc—Inversi ...

  10. FileOutputFormat

    TextOutputFormat<K,V> 默认输出字符串输出格式: SequenceFileOutputFormat<K,V> 序列化文件输出: MultipleOutput ...