C# Linq Where子句中比较两个属性和两个值之间的差异 请考虑以下陈述: var matches = person.Contacts.Where(c => c.ContactType == searchContact.ContactType).ToList();
这将过滤与searchContact对象的ContactType匹配的所有记录,并仅返回已过滤的person联系人。 但是如果Where子句末尾没有ToList()方法调用,它将返回person的所有联系人C# Linq Where子句中比较两个属性和两个值之间的差异 请考虑以下陈述: var matches = person.Contacts.Where(c => c.ContactType == searchContact.ContactType).ToList();,c#,linq,C#,Linq,这将过滤与searchContact对象的ContactType匹配的所有记录,并仅返回已过滤的person联系人。 但是如果Where子句末尾没有ToList()方法调用,它将返回person的所有联系人 现在,考虑下面的代码段。 Dictionary<int, string> colors = new Dictionary<int, string>(){ {1, "red"}, {2, "blue"}, {3, "green"}, {4, "yellow"}, {5,
现在,考虑下面的代码段。
Dictionary<int, string> colors = new Dictionary<int, string>(){ {1, "red"}, {2, "blue"}, {3, "green"}, {4, "yellow"}, {5, "red"}, {6, "blue"}, {7, "red"} };
var colorSet = colors.Where(c => c.Value == "red");
Dictionary colors=newdictionary(){1,“red”}、{2,“blue”}、{3,“green”}、{4,“yellow”}、{5,“red”}、{6,“blue”}、{7,“red”};
var colorSet=colors.Where(c=>c.Value==“红色”);
此查询将仅过滤值为“red”的元素,甚至不调用ToList()方法
我的问题是,为什么这两条语句(一条比较值,一条比较属性)在没有ToList()方法调用的情况下会以不同的方式运行?
为什么FirstOrDefault而不是Where子句不会出现此问题
我真的很感激,如果有人能解释这个场景或发布一些我可以遵循的参考资料。
谢谢
但是如果Where子句末尾没有ToList()方法调用,它将返回person的所有联系人
你错了。ToList
只是强制迭代,并将过滤后的元素作为列表提供给你LINQ
使用延迟执行,这意味着直到你使用foreach
循环迭代项目或使用ToList
或ToArray
方法,它没有执行。因此ToList
不会更改您的项目Value
也是一个属性(请参见KeyValuePair
class),因此您在这两个查询中都基于属性值执行比较。没有任何区别
但是如果Where子句末尾没有ToList()方法调用,它将返回person的所有联系人
你错了。ToList
只是强制迭代,并将过滤后的元素作为列表提供给你LINQ
使用延迟执行,这意味着直到你使用foreach
循环迭代项目或使用ToList
或ToArray
方法,它没有执行。因此ToList
不会更改您的项目Value
也是一个属性(请参见KeyValuePair
class),因此您在这两个查询中都基于属性值执行比较。没有任何区别
但是如果Where子句末尾没有ToList()方法调用,它将返回person的所有联系人
否,如果没有ToList
,它将返回一个查询,在迭代时,该查询将生成与指定要筛选的值匹配的所有联系人。调用ToList
只能将该查询具体化为该查询的结果。等待一段时间并在稍后进行迭代,可能使用其他迭代方法,例如foreach
,只有在底层数据源(在本例中,从thigns的外观来看,是数据库)更改其数据时,才会更改结果
至于你的字典过滤器,同样的事情也适用。在不调用ToList
的情况下,该变量表示在请求时获取数据的查询,而不是该查询的结果,这是通过调用ToList
可以得到的结果
在这里,属性与字段的使用是无关的。话虽如此,两个查询都使用属性,而不是字段。即使一个人使用了一个字段,它也不会改变任何事情
但是如果Where子句末尾没有ToList()方法调用,它将返回person的所有联系人
否,如果没有ToList
,它将返回一个查询,在迭代时,该查询将生成与指定要筛选的值匹配的所有联系人。调用ToList
只能将该查询具体化为该查询的结果。等待一段时间并在稍后进行迭代,可能使用其他迭代方法,例如foreach
,只有在底层数据源(在本例中,从thigns的外观来看,是数据库)更改其数据时,才会更改结果
至于你的字典过滤器,同样的事情也适用。在不调用ToList
的情况下,该变量表示在请求时获取数据的查询,而不是该查询的结果,这是通过调用ToList
可以得到的结果
在这里,属性与字段的使用是无关的。话虽如此,两个查询都使用属性,而不是字段。即使一个人确实使用了一个字段,它也不会改变任何事情。你错了。如果不调用ToList()
或其他方法强制立即执行,这两条语句都将返回IQueryable
。在您使用foreach
对查询变量进行迭代之前,查询变量将保持不变
这篇关于MSDN的文章应该很好地解释这一点:
您所经历的被称为延迟查询执行
在返回值序列的查询中,查询变量
它本身从不保存查询结果,只存储查询
命令。查询的执行延迟到查询变量
在foreach或For Each循环中迭代。这被称为
推迟执行
当您使用ToList()
时,发生的情况称为立即查询执行
与产生
值序列,执行返回单例值的查询
马上。单例查询的一些示例包括Average、Count、,
第一个和最大值。由于查询必须
生成一个序列以计算单例结果。你也可以
强制立即执行。当您要缓存
查询的结果。强制立即执行不符合以下条件的查询:
如果不生成单例值,则可以调用ToList方法
ToDictionary方法,或查询或查询的ToArray方法