是否可以动态限制从 LINQ to SQL 查询返回的列数?
我有一个包含 50 多个列的数据库 SQL View 。我的应用程序有一个包含 50 多个属性的域对象,每列一个。在我的 winforms 项目中,我将域对象列表绑定(bind)到网格。默认情况下,只有少数列可见,但用户可以打开/关闭任何列。
用户提示网格加载时间太长。我捕获了 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 View 生成的,因此当上面的代码执行时,它会生成类似“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。
最佳答案
像这样的东西应该可以工作:
List<string> columns = new List<string>();
columns.Add("EmployeeID");
columns.Add("HireDate");
columns.Add("City");
将列添加到您的列表 ^。
var result = Class.ReturnList(columns);
将列表传递给方法 ^。
public static List<Entity> ReturnList(List<string> VisibleColumns)
{
StringBuilder SqlStatement = new StringBuilder();
SqlStatement.Append("Select ");
for (int i = 0; i < VisibleColumns.Count; i++)
{
if (i == VisibleColumns.Count - 1)
{
SqlStatement.Append(VisibleColumns[i]);
}
else
{
SqlStatement.Append(VisibleColumns[i]);
SqlStatement.Append(",");
}
}
SqlStatement.Append(" FROM Entity");
using (var ctx = new DataClasses1DataContext())
{
var result = ctx.ExecuteQuery<Entity>(SqlStatement.ToString());
return result.ToList();
}
}
这基本上只是生成一个 SELECT
语句,其中包含您通过 VisibleColumns
列表传入的所有字段。
在这种情况下,VisibleColumns
列表中的字符串将生成的 SQL 语句是:
Select EmployeeID, HireDate, City From Employee
(注意:我使用 Northwind 数据库对此进行了尝试,因此使用了 EmployeeID 等列名称。显然,您应该将它们替换为您自己的。)
关于c# - Linq To SQL 选择动态列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12805075/