Linq to SQL没有查询内存

时间:2014-08-01 02:01:36

标签: linq linq-to-sql

我正在使用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重新查询...

感谢您的帮助!

2 个答案:

答案 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);             
    }