LINQ查询检索整个记录而不是一个字段

时间:2015-09-04 09:56:40

标签: c# linq linq-to-sql

我有这个C#L2S代码:

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

它应该只读取fileName字段,但是当我检入SQL服务器分析器时,我看到此查询触发了完整的记录加载。这些字段包含文件二进制数据,因此全表加载需要相当长的时间。仅检索fileName字段只需几毫秒。

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

也许我必须在不引用linqRawFile的情况下构造查询?难道不会忽略linq在项目中引入的原因,将数据库层抽象出来吗?

2 个答案:

答案 0 :(得分:1)

你应该可以用这个代替整个事情:

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

答案 1 :(得分:1)

  

它应该只读取fileName字段

不,它没有。这是正在发生的事情:您的查询执行发生在两个地方 - 在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;