Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定滤波器参数后如何使用linq选择数据_C#_Asp.net Mvc_Linq_Entity Framework - Fatal编程技术网

C# 确定滤波器参数后如何使用linq选择数据

C# 确定滤波器参数后如何使用linq选择数据,c#,asp.net-mvc,linq,entity-framework,C#,Asp.net Mvc,Linq,Entity Framework,我有一个报告,其中用户可以选择不同的过滤器应用于数据集 在设计时,我不知道用户将应用什么过滤器,所以我获取了整个数据集 例如,如果用户想要查看住在芝加哥的联系人,我首先获取所有联系人 IList<contact> contacts = db.contacts.ToList(); 问题在于,让所有联系人进行筛选需要大量资源。是否有一种方法可以等待从数据库中检索联系人,直到我获得查询的所有参数 我意识到我做错了,但我需要知道正确的方法。不要第一次调用ToList()。这会将所有数据拉入

我有一个报告,其中用户可以选择不同的过滤器应用于数据集

在设计时,我不知道用户将应用什么过滤器,所以我获取了整个数据集


例如,如果用户想要查看住在芝加哥的联系人,我首先获取所有联系人

IList<contact> contacts = db.contacts.ToList();
问题在于,让所有联系人进行筛选需要大量资源。是否有一种方法可以等待从数据库中检索联系人,直到我获得查询的所有参数


我意识到我做错了,但我需要知道正确的方法。

不要第一次调用
ToList()
。这会将所有数据拉入内存。虽然您还没有这样做,但数据的形式是
IEnumerable
。这使用“惰性评估”,这意味着要枚举的项在被请求之前不会实际生成。在Linq To SQL的情况下,只有在第二次调用
ToList()
时,才会运行数据库查询

IEnumerable
实际上不是一个容器,而是一个对象,包含一段知道如何获取序列中下一个元素的代码。这段代码可以是各种各样的东西——它可以从实际的容器中读取,动态生成每个值,或者从其他地方获取值,比如数据库。然而,列表是一个容器。调用
ToList
时,下一项将从
IEnumerable
中重复提取,并放置在
列表中。此时,内存中正好有一组对象。当你不想拥有一个从某处获取值的模糊的“东西”并且拥有一个装满实际元素的实际容器时,你经常调用
ToList
。例如,
IEnumerable
可能不会在每次使用时为您提供相同的对象。一旦将它们放入
列表中
,您就知道它们无法更改。在您的情况下,您希望继续使用这个模糊的东西,直到您确定您将要向数据库请求什么

这种工作方式是LINQ的基础,也是LINQtoSQL如此优秀的主要原因。我强烈建议您阅读一些关于Linq如何工作的内容,并稍微玩玩一下List和IEnumerable。对此进行了大量讨论,包括一个重新实现Linq的示例,这样您就可以看到它是如何工作的。如果你阅读了所有的内容,你将成为Linq专家(而且时间也会很晚),但是。

不要调用
ToList()


您将从EF获得一个
IEnumerable
。使用惰性评估对您有利-它对于大型数据集特别有用,因为每次调用
.ToList()
都会用列表填充内存。

“如果用户想查看住在芝加哥的联系人,我首先会获取所有联系人…”为什么??。此时使用filter执行查询,而不是获取所有记录然后应用filter。如果第一行没有
ToList
调用,那么这将满足您的需要。然后,它将使用Where的
Queryable
版本,并将Where谓词发送给查询提供者(如果它能够正确地翻译它的话)。
contacts = contacts.Where(t => t.state == form["state"]).ToList();