Linq To Entities 及其相关(进阶)
上篇我们讲解了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 及其相关(进阶)的更多相关文章
- Linq To Entities 及其相关
说到Linq,很多人都非常熟悉,我们可以很方便的用它来操纵对象的集合.今天要说的是Linq To Entities及其相关的操作.下面一步一步的来进行.这里我着重强调的是语法上面的一些注意点.所以怎么 ...
- LINQ to Entities 查询语法
转自: http://www.cnblogs.com/asingna/archive/2013/01/28/2879595.html 实体框架(Entity Framework )是 ADO.NET ...
- LINQ(LINQ to Entities)
LINQ to Entities 是 LINQ 中最吸引人的部分.它让你可以使用标准的 C# 对象与数据库的结构和数据打交道.使用 LINQ to Entities 时,LINQ 查询在后台转换为 S ...
- C#_LINQ(LINQ to Entities)
LINQ to Entities 是 LINQ 中最吸引人的部分.它让你可以使用标准的 C# 对象与数据库的结构和数据打交道.使用 LINQ to Entities 时,LINQ 查询在后台转换为 S ...
- LINQ to Entities 查询中的标准查询运算符
投影和筛选方法 投影指的是转换的结果集到所需的窗体中的元素. 例如,可以从结果集中的每个对象投影所需的属性子集,可以投影一个属性并对其执行数学计算,也可以从结果集投影整个对象. 投影方法有 Selec ...
- LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”
我就不屁话,能一张图就解决的就不说话了 2015-03-28 14:53:24,440 [10] ERROR log - System.NotSupportedException: LINQ to E ...
- 【转】Entity Framework技术系列之7:LINQ to Entities
前言 LINQ(Language Integrated Query,语言集成查询)是一组用于C#和VB.NET语言的扩展,它允许编写C#或者VB.NET代码,以与查询数据库相同的方式操作内存数据. L ...
- mvc ef LINQ to Entities 不识别方法“Int32 Parse(System.String)”,因此该方法无法转换为存储表达式。
private sys_User GetUserInfo() { sys_User model = null; var userId = Convert.ToInt32(AccountHelper.G ...
- Linq to entities 学习笔记
Linq to entities ---提供语言集成查询支持用于在概念模型中定义的实体类型. 首先可以根据http://msdn.microsoft.com/en-us/data/jj206878该 ...
随机推荐
- android 使用HttpURLConnection方式提交get/post请求
源码链接 package com.zhangbz.submitdata.Utils; import java.io.ByteArrayOutputStream; import java.io.IOEx ...
- C++语言-02-函数
普通函数 C++是在C语言的基础上增加了面向对象特性的语言,是C语言的超集 C++中的普通函数与C语言中的普通函数具有类似的性质.请参照以下博客:C语言-04-函数 与类相关的函数 C是一种OOP语言 ...
- iOS开发之网络编程--6、NSURLSessionConfiguration笔记
NSURLSessionConfiguration对象用于初始化NSURLSession对象. 展开请求级别中与NSMutableURLRequest相关的可供选择的方案,我们可以看到NSURLSes ...
- LCS修改版(Longest Common Subsequence 最长公共子序列)
题目描述 作为一名情报局特工,Nova君(2号)有着特殊的传达情报的技巧.为了避免被窃取情报,每次传达时,他都会发出两句旁人看来意义不明话,实际上暗号已经暗含其中.解密的方法很简单,分别从两句话里删掉 ...
- Monyer's Game 6~10关过关方法
从Monyer's Game开通到现在,已经有50多人通关了.其中绝大部分人,不管是自己独立完成也好,参考别人也罢,都是自己一步一步过去的.像陆羽兄弟甚至已经为游戏做好了整个通关的教程,在此Monye ...
- 定制Asp.NET 5 MVC内建身份验证机制 - 基于自建SQL Server用户/角色数据表的表单身份验证
背景 在需要进行表单认证的Asp.NET 5 MVC项目被创建后,往往需要根据项目的实际需求做一系列的工作对MVC 5内建的身份验证机制(Asp.NET Identity)进行扩展和定制: Asp.N ...
- openstack kilo compute更新后报错IncompatibleObjectVersion: Version 1.2 of PciDeviceList is not supported
前几天在compute节点更新openstack的包后,发现报错IncompatibleObjectVersion: Version 1.2 of PciDeviceList is not suppo ...
- 完全卸载VS2005或VS2008的步骤
手动卸载步骤: Visual Studio Express Editions 进入控制面板,运行添加或删除程序 卸载 "MSDN Library for Visual Studio 200 ...
- 使用NDK c++建立一个Android应用
使用NDK c++建立一个Android应用 一.工具 ADT(集成了eclipse,cdt,ndk plug-in) NDK (用它来编译c/c++程序) JDK (Java开发包) ANT(ecl ...
- zip文件jQuery工作地点选择城市代码
效果 地址下载:http://download.csdn.net/detail/xiaoliu123586/9201925 2.效果 源码:http://download.csdn.net/detai ...