我真的需要在收集使用AsQueryable已()?(Do i really need use AsQ

2019-07-29 07:43发布

示例代码:

List<Student> Students = new List<Student>()   
{   
    new Student(101, "Hugo", "Garcia", new List<int>() { 91, 88, 76, 93 }),  
    new Student(102, "Rick", "Adams", new List<int>() { 70, 73, 66, 90 }),  
    new Student(103, "Michael", "Tucker", new List<int>() { 73, 80, 75, 88 }),  
    new Student(104, "Fadi", "Fakhouri", new List<int>() { 82, 75, 66, 84 }),  
    new Student(105, "Peter", "Barrows", new List<int>() { 67, 78, 70, 82 })  
};

var query = from student in Students
            where student.Marks.AsQueryable().All(m => m > 70)
            select student;

foreach (Student student in query)
{
    Console.WriteLine("{0} {1}<br />", student.FirstName, student.LastName);
}

但是,如果我更改查询到

var query = from student in Students
            where student.Marks.All(m => m > 70)
            select student;

这也适用,并产生相同的结果,所以有什么区别?

Answer 1:

IQueryable的需要/推荐来从远程源(例如来自数据库)的对象。

对于在内存中的集合是没有用的。

AsQueryable已被使用时表达式树将被构造。

我能想到的方案的地方是最合适的。 在您的例子让说,你需要从数据库中根据学生的ID的一些信息。

现在的学生是在内存中的集合。 你需要根据学生的ID火灾的数据库查询。

  var studentList = Students.Select(s => s.Id).AsQueryAble().Select(i => remoteDBProvider.GetInfo(i));

在studentList任何进一步的动作从IQueryable的接口(查询表达式)被调用,并且将获取仅从数据源,这应被只要返回作为最终的查询结果(作为数据源,返回值的那些记录remoteDBProvider.GetInfo在例如,支持QueryProvider )。



Answer 2:

它做的表达式树是如何建立。 看这个:

AsQueryable已是允许查询被转换为的IQueryable的实例的方法。 当您在一个现有的查询使用AsQueryable已运营商和应用进一步转换,如应用过滤器或指定的排序顺序,这些拉姆达语句转换为表达式树。 根据您所使用的提供商,表达式树将被转换成域特定的语法,比执行。 在LINQ到SQL提供商的情况下,表达式树将被转换为SQL和SQL服务器上执行。 但是,如果你在一个查询中使用AsQueryable已运营商没有实现IQueryable的,只有实现IEnumerable,比你申请的查询会自动退到了IEnumerable规范的任何转换。 这意味着,通过标记与AsQueryable已你到SQL和LINQ双方的LINQ的好处对象实现查询。 如果现有的查询碰巧实现IQueryable的,查询由LINQ的转换为SQL到SQL供应商,否则查询在形式IL代码存储器执行。

参考这里



Answer 3:

在你的情况下, List<Student> ,它并没有什么差别,因为返回IQueryable<T>将使用相同的方法进行查询,如果你没有使用AsQueryable()在所有。

一些方法期望一个IQueryable<T>参数。 我认为AsQueryable()扩展方法是对这些情况大多是有用的,当你需要传递一个IQueryable<T>但只有一个IEnumerable<T>

MSDN说,大约AsQueryable

如果源的类型实现IQueryable<T> AsQueryable<TElement>(IEnumerable<TElement>)直接返回。 否则,它返回一个IQueryable<T>通过调用在等效查询运算符方法执行查询Enumerable ,而不是那些在Queryable

所以,你的情况是指( List<T>没有实现IQueryable<T>你真的不需要AsQueryable



文章来源: Do i really need use AsQueryable() on collection?