加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Linq to SQL选择动态列

发布时间:2020-12-15 18:12:13 所属栏目:百科 来源:网络整理
导读:是否可以动态地限制从LINQ返回到SQL查询的列数? 我有一个数据库SQL视图超过50列.我的应用程式拥有超过50个属性的域对象,每列一个.在我的winforms项目中,我将域对象的列表绑定到网格.默认情况下,只有少数列可见,但用户可以打开/关闭任何列. 用户抱怨网格加载
是否可以动态地限制从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等列名称,你应该用自己的名字替换它们.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读