LINQ查询方法一共提供了两种扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerable<T>接口的集合进行扩展;Queryable类,针对继承了IQueryable 我们会发现接口IQueryable<T>实际也是继承了IEnumerable<T>接口的,既然这样微软为什么要设计出两套扩展方法呢? 那么,到底什么时候使用IQueryable<T>,什么时候使用IEnumerable<T>? orders) { Console.WriteLine("OrderId:" + order.OrderID); } } 通过vs的Intellisense我们可以看到Where的返回类型为IQueryable 现在我们应该知道何时使用IEnumerable<T>,何时使用Iqueryable<T>。
IQueryable<Product> query = db.Products; foreach (string keyword in keywords) { string temp = keyword ; query = query.Where(p => p.Description.Contains(temp)); } 与 IQueryable<Product> query = db.Products 有幸在msn群里得到老赵的提点,原因如下: IQueryable查询时,实际上是构建一个Expression Tree(表达式树),如果使用foreach迭代变量时,表达式树实际上得到的只是迭代变量的一个引用
下面内容摘自上面第4篇博客,非本人原创: 那么什么时候用IQueryable,什么时候用IEnumerable? (每次在执行where查询操作符的时候IQueryProvider会为我们创建一个新的IQueryable,调用AsEnumerable()方法的时候并不会去实际取值,只是 得到了一个IEnumerable (解析表达式,然后执行取得结果)) 这就是IQueryable的延迟加载把. .知识点总结 (1) 解决查询多次的问题,因IQueryable延迟加载,当用到集合的时候,provider会解析表达式
也就是说:实现了此接口的object,就可以直接使用foreach遍历此object; IQueryable 接口 它继承 IEnumerable 接口,而因为.net版本加入Linq和IQueryable using (SchoolDBEntities schoolEntities = new SchoolDBEntities()) { //查询的结果放入IQueryable 接口的集合中 IQueryable<T_Class> classesIQue = (from c in schoolEntities.T_Class 第一种:直接返回 IQueryable类型的查询,如下图所示: ? 第二种:在用分页查询之前先将其转换成 IEnumerable实际执行的sql如下图所示: ? 总结 IQueryable接口与IEnumberable接口的区别: IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable
这节来讲一下C#中的内建接口:IQueryable 。 IQueryable是 IEnumerable 接口的子接口,相比之下提供了更丰富的查询功能。 一 IQueryable特点 延迟查询执行:IQueryable 接口支持延迟查询执行的特性。 强类型查询:IQueryable 接口允许我们使用强类型的查询表达式,利用编译器的类型检查来捕获错误和提供智能感知。 查询提供者:IQueryable 接口依赖于查询提供者(Query Provider),它是实际执行查询的组件。 通过利用 IQueryable 接口,我们可以以一种类型安全且灵活的方式对数据源进行查询和操作。
IQueryable简单分页的扩展方法 ,废话不多说,直接上干货! cancellationToken"></param> public static async Task<Page<T>> ToPagedListAsync<T>( this IQueryable pageIndex, pageSize, count); } public static Page<T> ToPagedList<T>( this IQueryable
也就是说:实现了此接口的object,就可以直接使用foreach遍历此object; IQueryable 接口 它继承 IEnumerable 接口,而因为.net版本加入Linq和IQueryable using (SchoolDBEntities schoolEntities = new SchoolDBEntities()) { //查询的结果放入IQueryable 接口的集合中 IQueryable<T_Class> classesIQue = (from c in schoolEntities.T_Class 第一种:直接返回 IQueryable类型的查询,如下图所示: 第二种:在用分页查询之前先将其转换成 IEnumerable实际执行的sql如下图所示: 总结 IQueryable接口与IEnumberable 接口的区别: IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable<T> 是将Skip ,take 这些方法表达式翻译成
IQueryable 理解IQueryable的最简单方式就是,把它看作一个查询,在执行的时候,将会生成结果序列。 IQueryable是一个继承了IEnumerable接口的另一个接口。 Queryable是一个静态类型,它集合了许多扩展方法,扩展的目标是IQueryable和IEnumerable。它令IQueryable和IEnumerable一样,拥有强大的查询能力。 实现IQueryable<T> 首先我们自建一个类别FrankQueryable,继承IQueryable<T>。 IQueryable与 IEnumerable的异同? 首先IQueryable<T>是解析一棵树,IEnumerable<T>则是使用委托。 IQueryable总结 理解IQueryable的最简单方式就是,把它看作一个查询,在执行的时候,将会生成结果序列。
IQueryable<T>接口貌似是一个对象,但是它们都属于一个完整的IQueryable<T>中的一员。N层对象体现在哪里? IQueryable具备延迟加载的能力。 5】.IQueryable<T>与IQueryProvider一对一的关系能否改成一对多的关系 IQueryable对象都有一个配套的IQueryProvider对象,在频繁的创建IQueryable的时候都会重新创建 我们可以适当的修改实现IQueryable类的内部结构,让每次创建IQueryable之后能重用上一次的IQueryProvider的对象,毕竟IQueryProvider对象没有任何的中间状态的数据, ORM一直是我们比较喜欢去写的框架,这里就使用自定义的IQueryable来查询相应的对象实体。首先我们需要继承IQueryable<T>接口来让LINQ能查询我们自己的数据上下文。
IQueryable<T>接口是Linq to Provider的入口,非常有意思的是它并不是一个IQueryable<T>来支撑一次查询。 我们来分析一下IQueryable<T>接口的代码。 这幅图重点是IQueryable<T>对象的连续操作,大致原理是每次执行扩展方法的时候都会构造一个新的IQueryable<T>,本次的IQueryable<T>对象将包含上次执行的表达式树,以此类推就形成了一颗庞大的表达式树 我们直接用源码进行讲解吧; public static IQueryable<TResult> Select<TSource, TResult>(this IQueryable<TSource> source 3.4】.链式查询方法的设计误区(重点:一次执行程序多次处理) 在使用IQueryable<T>时,我们尝试分析源码,看看IQueryable内部使用原理来帮我们生成表达式树数据的,我们顺其自然的看到了
本文对常用的数据结构详述:Array, ArrayList,List,IList,ICollection, Stack, Queue, HashTable, Dictionary, IQueryable IQueryable与IEnumberable不同的是,当从服务器端加载过量的数据,IQueryable会自动减少应用负载。 IQueryable可保证大数据量时应用程序的高性能。 IQueryable会先过滤数据,然后发送给客户端。 ? 18: 19: IQueryable<employee> queryIQueryable=null; 20: 21: //Bring 生成 IQueryable : SELECT [Extent1].[ID] AS [ID], [Extent1].[Name] AS [Name], [Extent1].
public static class MyTools { public static IQueryable<TSource> MyOrderBy<TSource>(this IQueryable <TSource> result = (IQueryable<TSource>)mothed.Invoke(null, new object[] { source, sort }); <TSource> DealAsc<TSource, M>(this IQueryable<TSource> source, string sort) { //生成 <TSource> DealDesc<TSource, M>(this IQueryable<TSource> source, string sort) { // 表达式 /// static Expression<Func<TSource, M>> CreateLamdba<TSource, M>(this IQueryable
列表
///
/// <returns>IQueryable列表</returns>
public virtual IQueryable <<#=tableName #>> IQueryable()
{
return base.IQueryable();
}
/// ">表达式</param>
/// <returns>IQueryable列表</returns>
public virtual IQueryable<<#=tableName <Sys_Role> IQueryable()
{
return base.IQueryable();
}
///
IQueryable<out T>继承自IEnumerable<T>,是个标记接口。 NET也提供了几个对IEnumerable和IQueryable接口进行操作的扩展方法,如: Cast<TResult>和OfType<TResult>。 两个接口 在LINQ中,一个查询表达式被编译为表达式树或者委托,查询结果为IEnumerable<T>类型则被编译为委托,查询结果是IQueryable或IQueryable<T>类型则被编译为表达式树 System.Linq.IQueryable<T> 在执行查询操作时,IQueryable先在服务器端进行过滤操作(如果有的话),然后再将数据放到本地内存中。 IQueryable适合使用对进程外(如数据库)的数据进行查询操作,如:LINQ to Entities。
IQueryable/IQueryable 和表达式树 IQueryable有两个组件 Expression:当前查询的组件的与语言和数据源无关的表示形式,以表达式树的形式表示。 达式树是不可变的;如果需要不同的表达式树并因此需要不同的查询,则需要将现有表达式树转换为新的表达式树,从而转换为新的 IQueryable。
.: 没人提到LINQBridge是很奇怪的.这个小巧的项目是LINQ(IEnumerable,但没有IQueryable)及其依赖(Func,Action等)到.NET 2.0的后端.和: 如果您的项目在编译期间引用 LINQ to SQL和LINQ到实体需要许多新的类(DataContext/ ObjectContext,大量的属性,EntitySet,EntityRef,Link,IQueryable,等)和表达式树 dim q = xs.where(function(x) x > 2).select(function(x) x * 4); 对于3.5框架附带的LINQ功能,这些方法在IEnumerable或IQueryable <extension()> public function Select(of T, R)(source as IQueryable<t>, transform as Expression(of Func (of T, R)) 'build a composite IQueryable that contains the expression tree for the transformation
/// <returns></returns> public static List<T> ExecuteQuery<T>(this DataContext dataContext, IQueryable /// <returns></returns> public static List<T> ExecuteQuery<T>(this DataContext dataContext, IQueryable /// <returns></returns> private static SqlCommand GetCommand(this DataContext dataContext, IQueryable /// <returns></returns> public static List<T> ExecuteQuery<T>(this DataContext dataContext, IQueryable /// <returns></returns> public static List<T> ExecuteQuery<T>(this DataContext dataContext, IQueryable
</param> /// <returns></returns> public static IOrderedQueryable<T> OrderBy<T>(this IQueryable </param> /// <returns></returns> public static IOrderedQueryable<T> OrderBy<T>(this IQueryable </param> /// <returns></returns> public static IOrderedQueryable<T> OrderBy<T>(this IQueryable (ToLambdaWhere<T>(propertyName, content)); } public static IQueryable<T> WhereList<T>(this IQueryable <T>, IQueryable<T>> UseCoditionFind<T>(this IQueryable<T> source, CoditionEntity coditionEntity)
1、LINQ to SQL集成到应用程序中需考虑的一个问题, 到底应该返回IQueryable<T>还是IQueryable? 0; Scale = 0) [, ] DLINQ生成的SQL语句是利用TOP和嵌套子查询, 这种方法已经被证明是比较高效的做法(相比于临时表的做法), 所以完全有理由可以一试.到这里, List, IQueryable , IQueryable都没有任何问题. 3、需要一个动态排序功能, 这里List的局限性出来了, 传统的做法可能需要用一个dynamic参数来传递需要排序的列然后到SP当中来执行, 但我们已经不打算使用 但是IQueryable不能跨assembly, 一旦跨了assembly的话, 你无法使用var来引用匿名类里面的property, 绑定到control是没有问题的, 但是客户端的动态查询却成了问题 那么选择IQueryable<T>, 我们选择返回IQueryable<T>给客户端, 分页/排序都没有任何问题.
/// <param name="sortDirection"></param> /// <returns></returns> public static IQueryable <T> DataSorting<T>(IQueryable<T> source, string sortExpression, string sortDirection) { <T> DataPaging<T>(IQueryable<T> source, int pageNumber, int pageSize) { if (pageNumber <T> SortingAndPaging<T>(IQueryable<T> source, string sortExpression, string sortDirection, int pageNumber source.Expression, Expression.Lambda(Expression.Property(param, sortExpression), param)); 生成排序表达式 IQueryable