2015-09-04 62 views
1

我有这个C#L2S代码:LINQ查询检索整个记录,而不是一个领域

Table<ERPRaw> linqRawFile = db.GetTable<RawFile>(); 
var linqNameList = 
    from row in linqRawFile.AsEnumerable() 
    select row.fileName; 
currentFileNameList = linqNameList.ToArray(); 

它应该只读文件名场,但是当我在SQL Server Profiler中检查,我看到这个查询触发完整的记录加载。这些字段包含文件二进制数据,因此全表加载需要相当长的时间。仅检索fileName字段只需要几毫秒。

什么是正确的方式来检索作为字符串数组中的RawFile的只fileName字段?我假设linq框架现在全部加载每个RawFile记录,因为它没有看到我将只从列表中检索到fileName属性。

也许我必须构建查询而不参考linqRawFile呢?那么这是否会忽视linq在项目中引入的原因,以便将数据库层抽象出来?

+0

可能是由于'.AsEnumerable()'' – Ric

+0

VAR linqNameList =(从行linqRawFile选择行。文件名).ToList();' – markpsmith

回答

1

它应该只读文件名域

不,不。以下是发生了什么:您的查询执行发生在两个地方 - RDBMS和内存中。 db.GetTable<RawFile>()发生在RDBMS中;它在内存中发生后的所有内容,因为你使用AsEnumerable()

发生投影的部分查询(即从整行中提取row.fileName列)发生在内存中。查询的RDBMS部分不知道这个预测。 db.GetTable<RawFile>()是所有SQL生成的LINQ提供者看到的,所以它自然返回整行。

如果你写对您的SQL源的组合查询,投影将在SQL发生:

var linqNameList = 
    from row in db.GetTable<RawFile>() 
    select row.fileName; 
1

你应该能够与它来取代整个事情:

var currentFileNameList = db.GetTable<RawFile>().Select(r => r.fileName).ToArray();