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

LINQ query retrieves whole record instead of one field

我有这个 C# L2S 代码:

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

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

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

也许我必须在根本不引用 linqRawFile 的情况下构建查询?是不是有点忽略项目中引入linq的原因,将数据库层抽象掉?

你应该可以用这个替换整个东西:

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

It's supposed to read only the fileName field

不,不是。这是正在发生的事情:您的查询执行发生在两个地方 - 在 RDBMS 和内存中。 db.GetTable<RawFile>() 发生在 RDBMS 中;它发生在内存中之后的一切,因为你使用 AsEnumerable().

发生投影的查询部分(即 row.fileName 列是从整行中提取的)发生在内存中。查询的 RDBMS 部分不知道此投影。 db.GetTable<RawFile>() 是所有 SQL 生成的 LINQ 提供程序所看到的,因此自然 returns 整行。

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

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