c# – Linq to SQL选择动态列
是否可以动态地限制从LINQ返回到SQL查询的列数?
我有一个数据库SQL视图超过50列.我的应用程式拥有超过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视图生成的,所以当上述执行它生成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(); } } 我不知道如何改变这个方法的正文来改变生成的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(); } } 这基本上只是使用VisibleColumns列表传递的所有字段的SELECT语句. 在这种情况下,VisibleColumns列表中的字符串将生成的SQL语句为: Select EmployeeID,HireDate,City From Employee (注意:我使用Northwind数据库尝试这样做,因此EmployeeID等列名称,你应该用自己的名字替换它们.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |