我正在使用Linq for SQL,并且一直以为我在内存中查询Query的结果。我刚刚查看了数据库,它显示了数千个查询,而不是1,这是我的预期。
我的方法是运行查询,然后使用linq在结果集中进行搜索。
IQueryable<mapping> fieldList = from mm in db.mappings
join mi in db.metaItems on mm.secondaryMetaItemId equals mi.metaItemId
join mo in db.metaObjects on mi.metaObjectId equals mo.metaObjectId
where mm.linkageId == 277
select mm;
for (int i=0;i<100;i++)
{
mapping thisVar = fieldList.FirstOrDefault(m => m.primaryItem == info.Name);
}
每次访问结果集时,如何阻止Linq重新查询...
感谢您的帮助!
答案 0 :(得分:1)
当您编写LINQ查询时,在您执行实际枚举它的操作(延迟执行)之前,查询实际上不会被执行。调用FirstOrDefault()
是一个这样的方法的示例,它枚举结果(必须找到第一个结果)。您需要调用一个方法或以其他方式枚举结果一次。这样,当你想在整个程序中引用这些结果时,就可以在存储的副本上进行。
最简单的方法是将其转换为列表。这会将结果作为列表存储在内存中。然后你可以使用它。
IQueryable<mapping> fieldList =
from mm in db.mappings
join mi in db.metaItems on mm.secondaryMetaItemId equals mi.metaItemId
join mo in db.metaObjects on mi.metaObjectId equals mo.metaObjectId
where mm.linkageId == 277
select mm;
// save it!
var result = fieldList.ToList(); // query is processed only once here
// do stuff with result
for (int i=0;i<100;i++)
{
// using the stored result
thisVar = result.FirstOrDefault(m => m.primaryItem == info.Name);
}
答案 1 :(得分:0)
试试这个:
var fieldList = (from mm in db.mappings
join mi in db.metaItems on mm.secondaryMetaItemId equals mi.metaItemId
join mo in db.metaObjects on mi.metaObjectId equals mo.metaObjectId
where mm.linkageId == 277
select mm).AsEnumerable();
foreach (int i=0;i<100;i++)
{
mapping thisVar = fieldList.FirstOrDefault(m => m.primaryItem == info.Name);
}