是否可以动态地限制从LINQ返回到SQL查询的列数?
@H_404_2@我有一个数据库sql视图超过50列.我的应用程式拥有超过50个属性的域对象,每列一个.在我的winforms项目中,我将域对象的列表绑定到网格.默认情况下,只有少数列可见,但用户可以打开/关闭任何列.
@H_404_2@用户抱怨网格加载时间太长.我捕获了LINQ生成的SQL查询,然后在sql Server Management Studio中执行它,并验证其缓慢.如果我更改sql语句,删除所有的不可见列,它几乎立即运行.性能与查询中的列数之间存在直接的相关性.
@H_404_2@我想知道是否可以动态地改变从LINQ生成的SQL查询返回的列数?例如,这里是我的代码当前的样子:
public List<Entity> GetEntities() { using (var context = new CensusEntities()) { return (from e in context.Entities select e).ToList(); } }@H_404_2@context.Entities对象是从包含超过50列的sql视图生成的,所以当上述执行它生成sql,如“SELECT Col1,Col2,Col3,… Col50 FROM Entity INNER JOIN …”.我想改变方法签名看起来像这样:
public List<Entity> GetEntities(string[] visibleColumns) { using (var context = new CensusEntities()) { return (from e in context.Entities select e).ToList(); } }@H_404_2@我不知道如何改变这个方法的正文来改变生成的sql语句,只返回我关心的列值,其他的都可以是NULL.
解决方法
这样的事情应该有效:
List<string> columns = new List<string>(); columns.Add("EmployeeID"); columns.Add("HireDate"); columns.Add("City");@H_404_2@将列添加到列表中^.
var result = Class.ReturnList(columns);@H_404_2@将列表传递给方法^.
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(); } }@H_404_2@这基本上只是使用VisibleColumns列表传递的所有字段的SELECT语句. @H_404_2@在这种情况下,VisibleColumns列表中的字符串将生成的sql语句为:
Select EmployeeID,HireDate,City From Employee@H_404_2@(注意:我使用Northwind数据库尝试这样做,因此EmployeeID等列名称,你应该用自己的名字替换它们.)