上篇我们讲解了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. Swift面向对象基础(中)——Swift中的存储属性和计算属性

    学习来自<极客学院> 1.存储属性:存储在类.结构体里的变量或者常量 2.分为:实例存储属性.类型存储属性 3.所有的存储属性必须显示的指定初始值,在定义时或者构造器当中指定 4.可选类型 ...

  2. 学习调用WCF服务的各种方法

    1.开发工具调用WCF 这中方法很方便也很简单,很多工作VS就帮我们完成了.相信大家也不会对这种方法陌生.这里简单提一下.打开VS,在项目中添加服务引用: 在config中自动声明了有关服务的节点信息 ...

  3. javascript图片库

    将图片发布到网上的办法很多,可以简单地把所有图片都放在一个网页中,但是会导致这个网页过于庞大.为每张图片分别创建一个网页的解决办法值得考虑,但是制作过程需要花费非常多的时间和精力. 如果想要两全其美, ...

  4. loadrunner常用函数

    1.关联函数:web_reg_save_param("session", "LB=value=", "RB=>", LAST);

  5. confluence wiki搭建使用

    1.准备工作 服务器环境:centos6.6x64 IP:172.16.0.203 1)软件包,地址下载 http://pan.baidu.com/s/1ntlBCQP  ,把几个 软件包放在服务器上 ...

  6. jquery parent和parents,children和find

    parent返回匹配元素的父元素的元素集合:parents返回匹配元素的祖先元素的元素集合. children返回匹配元素的子元素的元素集合:find返回匹配元素的后代元素的元素集合.

  7. A daemon process class in python

    In everbright task schedule project, we need some daemon process to do certain work, here is a examp ...

  8. fullpage.js 结合固定导航栏—实现定位导航栏

    开始制作自己的个人简历啦,决定要使用固定导航栏,又打算使用fullpage.js做全屏滚动. 仔细看了fullpage文档之后,发现不用额外写js代码就可以实现以下效果: 1.当滚动翻页时,导航栏也自 ...

  9. POJ 3416 Crossing --离线+树状数组

    题意: 给一些平面上的点,然后给一些查询(x,y),即以(x,y)为原点建立坐标系,一个人拿走第I,III象限的点,另一个人拿II,IV象限的,点不会在任何一个查询的坐标轴上,问每次两人的点数差为多少 ...

  10. AC日记——产生数 codevs 1009 (弗洛伊德)(组合数学)

    1009 产生数 2002年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descriptio ...