IEnumerable <T>和IQueryable <T>澄清?

Roy*_*mir 16 .net c# ienumerable iqueryable

看完这个问题后,我需要澄清一些事情.

IQueryable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;

IEnumerable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
Run Code Online (Sandbox Code Playgroud)

问题:

1)可以这么说:在第一个查询中,SQLServer正在运行整个操作,包括where子句,返回相关的行 - 而第二个查询SELECT *...并将所有 行返回 到C#和THEN过滤器?

2)如果我只有一个集合 - 在记忆中怎么样?(var lstMyPerson = new List<MyPerson>())

IQueryable<MyPerson> lst = from c in lstMyPerson 
where c.City == "<City>"
select c;
Run Code Online (Sandbox Code Playgroud)

VS

IEnumerable<MyPerson> custs = from c in lstMyPerson 
where c.City == "<City>"
select c;
Run Code Online (Sandbox Code Playgroud)

现在执行会有什么不同?

ang*_*son 34

1:不,那是不正确的

由于您只结果存储到a中IEnumerable<Customer>,但仍然具有产生结果的完全相同的表达式,因此它们将在服务器上执行并仅返回相关的行.

您可以通过以下方式获得行为上的差异:

IEnumerable<Customer> custs = from c in (IEnumerable<Customer>)db.Customers
    where c. City == "<City>"
    select c;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您强制使用db.Customers集合IEnumerable<T>,枚举时将获取整个集合.

请注意:

IEnumerable<Customer> x = from c in db.Customers
                          where c.City == "<City>"
                          select c;
Run Code Online (Sandbox Code Playgroud)

与此不一样:

IEnumerable<Customer> x = from c in db.Customers
                          select c;
IEnumerable<Customer> y = x.Where(c => c.City == "<City>");
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,该where子句将是SQL的一部分,在第二种情况下它不会.这就是为什么链接的问题/答案涉及差异,而你的代码却没有.

另请注意,只有您编写的语句实际上不会在服务器上执行任何操作,因为它们实际上只会存储一个惰性集合.如果你继续前进,列举这些集合,在这一点上的相关位将在服务器上执行.

2:List<T>没有实现或有扩展方法IQueryable<T>,LINQ运算符也不会返回任何兼容的东西IQueryable<T>

在这种情况下,第一个不会编译.

  • 这么晚才回复很抱歉.原因是编译器不再知道该集合是可以查询的集合.这意味着由于集合已存储到`IEnumerable <Customer>`中,因此`IQueryable <T>`运算符不再可用.因此,答案中的最后一个赋值将生成另一个惰性集合,但是当枚举时,此集合将首先从数据库中获取每个客户,然后在内存中进行过滤. (3认同)