我需要LINQ来获取整个表格,但这似乎不起作用...每次我通过pkey选择值时,会再次触发选择..
所以,实际上这段代码:
DataContext dc = new DataContext();
dc.Stores.ToList();
Store st = dc.Stores.SingleOrDefault(p => p.Id == 124671);
正在制作
select * from store
在“ToList()”方法和附加
select * from store where id = 124671
在它下面的选择部分......
当然,我想阻止它进行第二次选择..
我怎么办? (我不想将ToList()结果存储在List< Store>等附加属性中)
更新
关于你的答案意味着:
Store st = stores.SingleOrDefault(p => p.Id == 124671);
Store st = stores.SingleOrDefault(p => p.Id == 124671);
会触发2选择到DB,这会使LINQ-idea无用?!或者我在这里弄错了什么?
我认为LINQ基本上会保存我在选择中抓取的所有数据,并且只在“缓存”中找不到数据时执行另一个请求。所以,我认为它就像某种“神奇”的存储层之间我的应用程序和数据库..
更新#2
只是你明白了...我想在开始时(当抓取所有数据时)失去性能并在我从“缓存”数据中选择时赢回它...
答案 0 :(得分:8)
请改为尝试:
DataContext dc = new DataContext();
var allStores = dc.Stores.ToList();
Store st = allStores.SingleOrDefault(p => p.Id == 124671);
答案 1 :(得分:4)
(我假设它知道id是主键等)
哪个完全版本?这看起来像LINQ-to-SQL; 3.5(没有服务包),是 - 身份管理员是bit rubbish at this。它得到了better in 3.5 SP1,据说是fixed in 4.0。
在.NET 3.5 SP1中,Single(predicate)
方法适用于IIRC,所以也许使用它并捕获块? try
/ catch
将比网络跃点更快。
从后来的连帖:
这个bug现在已经修复了 包含在.NET Framework 4.0中。该 首先搜索缓存的优化 现在将完成基于ID的查找 对于 单/的SingleOrDefault /第一/ FirstOrDefault(谓语) 以及 凡(谓语)。单/的SingleOrDefault /第一/ FirstOrDefault() 其中谓词具有相同的含义 以前的限制。
答案 2 :(得分:0)
简短回答 - 您不需要拥有ToList()
长答案 - 您提供的示例中的ToList()调用完全是符号。使用Linq时,在实际枚举IQueryable之前,实际上没有在数据库服务器上执行任何操作。
如果您只想通过PK获取单个记录,那么只需要直接使用数据上下文:
var theStore = dc.Stores.SingleOrDefault(p => p.Id == 124671);
如果你真的想要获取所有记录并迭代它们,你可以调用表上的ToList():
var allStores = dc.Stores.ToList()
如果您想要的只是一条记录,请执行
var allStores = dc.Stores.ToList();
Store st = allStores.SingleOrDefault(p => p.Id == 124671);
完全失败。您将所有结果带入内存,然后让.Net过滤列表,从而失去数据库中索引的所有好处等。
答案 3 :(得分:0)
您正在做的是将结果作为列表,将其丢弃,然后再次查询原始文件。这就是你到数据库的双重旅行的原因。
ToList
方法返回列表作为结果,您可以将其存储在变量和查询中:
var stores = dc.Stores.ToList();
Store st = stores.SingleOrDefault(p => p.Id == 124671);