Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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中将列表转换为IQueryable的问题_C#_Linq_Iqueryable - Fatal编程技术网

C# Linq中将列表转换为IQueryable的问题

C# Linq中将列表转换为IQueryable的问题,c#,linq,iqueryable,C#,Linq,Iqueryable,编辑 实际上,这个问题应该更一般:如果带有IQueryable的Linq出现错误,如何将查询修改为DB 据我所知,正确的答案是——在数据库级别完成尽可能多的查询。因为在这种特殊情况下,我复杂的查询无法从Linq转换为sql 所以我刚刚用FromSqlRaw方法编写了一个原始sql查询,错误已经消失了。此外,与ToList方法相比,我编写查询时使用的过滤方法不接受所有条目,因此我对性能的怀疑较少,尽管我没有对其进行度量 需要了解如何使用linq将列表转换为IQueryable的帮助 我所拥有的:

编辑

实际上,这个问题应该更一般:如果带有IQueryable的Linq出现错误,如何将查询修改为DB

据我所知,正确的答案是——在数据库级别完成尽可能多的查询。因为在这种特殊情况下,我复杂的查询无法从Linq转换为sql

所以我刚刚用FromSqlRaw方法编写了一个原始sql查询,错误已经消失了。此外,与ToList方法相比,我编写查询时使用的过滤方法不接受所有条目,因此我对性能的怀疑较少,尽管我没有对其进行度量

需要了解如何使用linq将列表转换为IQueryable的帮助

我所拥有的: 数据库中的三个表,其中一个表包含基于IQueryable的查询

我需要的是: 通过Linq创建一个查询,将三个表中的数据组合在一起,并为我提供结果特定列,其中一个表的每个元素都有数据,并具有按此列过滤的功能

我尝试的是: 补充基于IQueryable的查询。但我发现列表到IQueryable的转换有问题。方法AsQueryable给出错误

我的成就: 我在Linq中用基于列表的逻辑重写查询,它提供了我所需要的。但我不明白:

这种做法好吗? 为什么我必须经常进行ToList转换以避免错误? 我的解决方案的速度比基于IQueryable的方法差吗? 下面是我的练习:

我需要的是listF变量

我将其中的CreateAsync方法完全替换为List的Create方法。好吗? 我还尝试将硬编码列表与CreateAsync方法/items2moq、items3moq/一起使用,但它们与基于过滤列表的查询一起提供源IQueryable的提供程序,但没有实现IAsyncQueryProvider错误。另外,当我将IQueryable用于NamesIQ而不是List用于NamesList时,我得到了参数类型不匹配的错误。这些错误的确切来源是什么

为什么我必须经常进行ToList转换以避免错误

我经常从三个层次来考虑Linq查询:

IQueryable—设计用于将Linq查询转换为等效的数据库或使用查询的任何数据源。许多Linq和非Linq操作无法转换为SQL或其他等效操作,因此该层将抛出错误。即使是像拆分字符串这样看似简单的操作,在SQL中也很困难,如果不是不可能的话

IEnumerable—在这一层中,Linq查询在内存中完成,因此可以更灵活地执行自定义操作。要从IQueryable层到IEnumerable层,AsEnumerable调用是最简单的。这将查询中获取原始数据的部分与可以创建自定义对象、执行更复杂的筛选和聚合等的部分分开。请注意,IEnumerable仍然使用延迟执行,这意味着在这个阶段,查询只是一个查询-结果不存在;在使用foreach循环或前进到下一层进行枚举之前,无法实际计算:

List/Array/etc。这是执行查询并将其转换为具体集合的地方。这一层的一些好处是可序列化性—您不能序列化枚举数,并且与上面描述的延迟执行相反,可以立即加载

因此,您可能会遇到一个错误,因为您的查询中有一些部分无法被底层可查询提供程序转换,而使用ToList是将原始数据具体化为列表的一种方便方法,它允许您执行更复杂的操作。不认为AsEnumerable会做同样的事情,但会保持延迟执行

这种做法好吗

可以,但通过在列表级别而不是数据库级别进行筛选,您可能很容易获得比所需更多的数据。我的一般做法是在数据库级别完成尽可能多的查询,只有在没有已知方法将查询的其余部分转换为SQL时,才移动到可枚举/列表级别

我的解决方案的速度比基于IQueryable的方法差吗

唯一知道的方法是尝试两种方法并测量差异。但是,如果您获得的原始数据比您需要的多,并且在内存中进行过滤,那么您的性能会更差,这是一个非常安全的赌注。

99.9%的时间,AsQueryable没有任何用处。这感觉像是一个XY问题。您试图解决的根本问题是什么?