C# Linq链式选择和区别运算符
我是LINQ的新手,有一个基本的问题 假设我有一个很大的客户对象列表C# Linq链式选择和区别运算符,c#,linq,C#,Linq,我是LINQ的新手,有一个基本的问题 假设我有一个很大的客户对象列表 List<Customer> c = null; c = //Fetch from DB - resulting into 1000+ non-unique Customers; CustomerEntityComparer只是一个基于CustomerID比较两个CustomerEntity对象的类。 我的问题是: 如果将Select和Distinct链接起来,是否会导致列表多次迭代 谢谢 维卡斯给出了一个更详细
List<Customer> c = null;
c = //Fetch from DB - resulting into 1000+ non-unique Customers;
CustomerEntityComparer只是一个基于CustomerID比较两个CustomerEntity对象的类。
我的问题是:
如果将Select和Distinct链接起来,是否会导致列表多次迭代
谢谢
维卡斯给出了一个更详细的回答:
您可以注意到Select()返回IEnumerable,Distinct()也返回IEnumerable。这是因为您基本上是在创建查询。在调用ToList()方法之前,不会执行任何选择或不同的筛选。当执行ToList()方法时,将计算整个查询。这叫做延迟执行 这样做的好处是,您可以创建如下查询:
var ceQuery = c.Select(cust => new CustomerEntity()
{
CustomerID = cust.CustID,
CustomerName = cust.CustName
}).Distinct(new CustomerEntityComparer());
然后每次更改“c”时,您都可以重新使用相同的ceQuery来获取最新的restul:
var ce = ceQuery.ToList();
问题是什么?你做了什么来研究它?简单的回答是:没有。但是你可以在数据库端进行这些转换(
选择DISTINCT
)。如果你想更多地了解LINQ(对象)的内部工作原理,我推荐Jon Skeet重新发明LINQ并解释所有涉及的原则(例如,当列表实际被迭代时)。但简单的答案是,它只会迭代原始列表一次。谢谢Chris。我会检查该链接。很酷。谢谢。我知道在LINQ To SQL的情况下,查询会转换为表达式树,然后在请求exec时,该树用于生成SQL。我还知道L2Object的延迟执行方面。但我不确定在L2Object的情况下,2个链式调用实际上只会在集合上迭代一次,即使延迟执行也是如此。我怀疑的是,这是因为执行了SELECT&DISTINCT操作。因此,我想再次检查。
var ce = ceQuery.ToList();