c# - Linq To SQL 选择动态列

标签 c# sql linq

是否可以动态限制从 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/

相关文章:

sql按多个属性对行进行分组

c# - 对数组中的 50+ 位数字进行排序

C# Linq 问题 : How to identify and count items in a set

c# - 查找重复记录并将记录合并到单个数据表 c#

c# - TagLib-Sharp - 重新标记文件

c# - 使用C#比较本地数据库的两个表

c# - 类监视器作为普通类

php - 如何防止 PHP 中的 SQL 注入(inject)?

c# - 类图是否自动更新?如果没有,是否可以这样做?

sql - 在一个范围内分组和排序的多个不同值