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

本文关键字:字段 一个 检索 查询 记录 LINQ | 更新日期: 2023-09-27 18:11:05

我有这个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的原因,将数据库层抽象出来吗?

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

它应该只读取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;

你应该可以用下面的内容来替换整个内容:

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