我真的需要在集合上使用AsQueryable()吗?

Che*_*ung 13 .net c# linq list asqueryable

示例代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将查询更改为

var query = from student in Students
            where student.Marks.All(m => m > 70)
            select student;
Run Code Online (Sandbox Code Playgroud)

这也有效并产生相同的结果,那有什么区别?

Til*_*lak 8

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

对于内存集合,它是没有用的.

在构造表达式树时使用AsQueryable.

我能想到最合适的场景.在您的示例中,假设您需要基于学生ID的数据库中的某些信息.

现在学生正在收集记忆.您需要根据学生ID触发数据库查询.

  var studentList = Students.Select(s => s.Id).AsQueryAble().Select(i => remoteDBProvider.GetInfo(i));
Run Code Online (Sandbox Code Playgroud)

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

  • @BorisB.那明显是错的.[Enumerable.Select](http://msdn.microsoft.com/en-us/library/bb548891.aspx)也使用延迟执行.区别在于Queryable接受lambda作为表达式.这允许查询提供程序检查表达式并将其转换为(可能)更高效的某些内容,例如SQL查询.任何预测或过滤都将在数据库中而不是在应用程序中进行,利用数据库的本机代码.但对于内存中的集合,它并没有什么不同. (6认同)