【发布时间】:2012-10-09 17:16:02
【问题描述】:
是否可以动态限制从 LINQ to SQL 查询返回的列数?
我有一个超过 50 列的数据库 SQL 视图。我的应用程序有一个具有 50 多个属性的域对象,每列一个。在我的 winforms 项目中,我将域对象列表绑定到网格。默认情况下,只有少数列可见,但用户可以打开/关闭任何列。
用户抱怨网格加载时间过长。我捕获了 LINQ 生成的 SQL 查询,然后在 SQL Server Management Studio 中执行它并验证了它的缓慢性。如果我更改 SQL 语句,删除所有不可见的列,它几乎会立即运行。性能与查询中的列数直接相关。
我想知道是否可以动态更改从 LINQ 生成的 SQL 查询返回的列数?例如,这是我的代码目前的样子:
public List<Entity> GetEntities()
{
using (var context = new CensusEntities())
{
return (from e in context.Entities
select e).ToList();
}
}
context.Entities 对象是从包含超过 50 列的 SQL 视图生成的,因此当执行上述操作时,它会生成类似“SELECT Col1, Col2, Col3, ... Col50 FROM Entity INNER JOIN...”的 SQL。我想将方法签名更改为如下所示:
public List<Entity> GetEntities(string[] visibleColumns)
{
using (var context = new CensusEntities())
{
return (from e in context.Entities
select e).ToList();
}
}
我不知道如何改变这个方法的主体来改变生成的SQL语句只返回我关心的列值,其他的都可以是NULL。
【问题讨论】:
-
必须是LINQ2SQL吗?您可以改用动态 sql:将您自己的 sql 语句构建为字符串,然后将其作为命令传递
-
我曾考虑过使用动态 sql,但真的希望使用 LINQ 找到一个好的解决方案。我们已经编写了一个扩展方法,它采用 IQueryable
并使用表达式树应用基于可见列数组的过滤器。它很棒,因为我可以在执行 LINQ to SQL 或 LINQ to Objects 时重新使用扩展方法。该框架足够智能,可以生成 SQL WHERE 子句或仅在内存中应用过滤器。同样,如果有一个可以利用 LINQ 且不需要我对 SQL 语法有任何了解的解决方案,那就太好了 -
你有没有找到一个好方法来做到这一点?