c# – Linq to SQL选择动态列

前端之家收集整理的这篇文章主要介绍了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等列名称,你应该用自己的名字替换它们.)

猜你在找的C#相关文章