我有这个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在项目中引入的原因,将数据库层抽象出来吗?
答案 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;