Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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#AsQueryable()对象放入内存_C#_Entity Framework - Fatal编程技术网

如何将C#AsQueryable()对象放入内存

如何将C#AsQueryable()对象放入内存,c#,entity-framework,C#,Entity Framework,我想使用实体框架通过AsQueryable()将数据库列表拉入内存,因为当我使用ToList()时,LINQ不再工作,因为它返回一个0个元素的列表 有可能做像这样的事情 var vwEntityList = dc.vwEntity.ToList().AsQueryable() ??我已经尝试过了,但是当我查询对象时,LINQ失败了。如果我只使用.AsQueryable(),它可以工作,但每次查询数据库时都会非常慢,我希望避免这种情况,我希望将EF视图作为一个可查询对象放到内存中 当我有我的列表

我想使用实体框架通过AsQueryable()将数据库列表拉入内存,因为当我使用ToList()时,LINQ不再工作,因为它返回一个0个元素的列表

有可能做像这样的事情

var vwEntityList = dc.vwEntity.ToList().AsQueryable()
??我已经尝试过了,但是当我查询对象时,LINQ失败了。如果我只使用.AsQueryable(),它可以工作,但每次查询数据库时都会非常慢,我希望避免这种情况,我希望将EF视图作为一个可查询对象放到内存中

当我有我的列表并尝试在上面使用LINQ时

var newlist = vwEntityList.Where(x => x.deal_status == "B").ToList();
newlist是一个包含0项的列表,当我通过对数据库运行类似的查询知道列表中应该有项时,它也可以在使用just.AsQueryable()时工作


谢谢

根据您提供的信息,这听起来很有效(但速度太慢,不符合您的喜好)

但这并不是:

var totalList = context.vwEntity.ToList();
var list = totalList.Where(x => x.deal_status == "B").ToList();
这种情况的原因是数据库排序。默认情况下,某些数据库(如SQL Server)对字符串使用不区分大小写的比较。因此,如果一个记录的状态为“b”,那么第一个查询将返回该记录,因为在SQL“b”==“b”中,但是一旦加载到内存中,Linq2Object where子句将进行区分大小写的比较。“B”“B”。SQL Server数据库可以配置区分大小写的排序规则,因此假设字符串总是不区分大小写是很危险的

Linq表达式对
IEnumerable
起作用,因此不需要强制列表返回到
IQueryable

如果使用Linq2Object,或针对区分大小写的数据库,则应确保在需要的地方进行不区分大小写的匹配,而不是依赖排序规则:

// this should work...
var totalList = context.vwEntity.ToList();
var list = totalList.Where(x => x.deal_status.ToUpper() == "B").ToList();

也就是说,将整个表/视图读取到内存中,然后对对象进行查询永远不会比查询实体“更快”,除非您可能需要执行许多不同的查询并希望将表缓存在内存中。如果要查询的字段没有索引,跨字符串查询通常会遇到性能障碍。我建议您熟悉针对任何数据库运行的查询分析器,以捕获EF正在执行的确切查询,从而确定性能瓶颈。当遇到缓慢的查询时,我想我从来没有推荐过“先将整个200k记录加载到内存中”作为解决方案

直到最后才使用
ToList
。你所说的“LINQ不再工作”和“LINQ失败”是什么意思?如果我理解你的场景,vwEntity已经可以使用了
var myList=dc.vwEntity.ToList()
应该将相应表中的所有实体具体化到内存中(因为查询中没有任何过滤方法)。不过我很困惑。您将目标变量命名为
obj
,这意味着一个对象而不是一个对象列表,并且您的DbSet也被写成一个单数单词
vwdentity
。还有一些事情正在发生。可能
deal_status
是小写,数据库使用不区分大小写的排序规则?请将代码设置为:
var vwEntityList=dc.vwEntity.ToList()
var newlist=vwentylist.Where(x=>x.deal\u status==“B”).ToList()
并设置一个断点,首先确保VWebEntityList确实有您要查找的记录,然后查看是否填充了新列表。
// this should work...
var totalList = context.vwEntity.ToList();
var list = totalList.Where(x => x.deal_status.ToUpper() == "B").ToList();