【问题标题】:LINQ to SQL custom query builderLINQ to SQL 自定义查询生成器
【发布时间】:2012-05-29 14:23:14
【问题描述】:

使用 ADO.NET 构建这样的自定义查询很容易:

SqlCommand.CommandText = "SELECT Column" + variable1 + ", Column" + Variable2 + " FROM TABLE";

在 LINQ to SQL 中可以这样做吗?

谢谢

【问题讨论】:

  • 您需要向我们提供一个更好的示例,说明您将如何使用它,然后我们才能为您提供帮助。
  • 您是否使用 ADO.NET 以这种方式构建查询?我的意思是将字符串与值连接起来?
  • string variable1 = "a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't";
  • @OskarKjellin 我知道如果变量来自 UI,人们可以进行注入附加,但我的变量不是。

标签: c# .net linq-to-sql


【解决方案1】:

没有构建动态查询的通用方法。

一个方法必须有一个已知的、特定的返回类型。这种类型可以 System.Object 但是你必须使用很多丑陋的反射代码 真正得到成员。在这种情况下,您还必须使用 很多丑陋的反射表达式树代码来生成返回 价值。

如果您尝试在 UI 端动态生成列 - 别那样做。在设计时定义列,然后简单地 显示/隐藏您实际需要/希望用户看到的列。有 您的查询返回所有可能可见的列。

除非您发现选择所有 数据列(在这种情况下,您可能有非覆盖索引 数据库级别的问题)那么你会好得多 这种方法。生成谓词和排序非常好 动态订购,但您真的不想使用 输出列表。 More about this

【讨论】:

    【解决方案2】:

    是的,您可以使用 Dynamic query with Linq 执行类似操作。
    这是一个示例,您可以使用 Dynamic query with Linq 构建自定义查询:

    string strWhere = string.Empty;
        string strOrderBy = string.Empty;
    
        if (!string.IsNullOrEmpty(txtAddress.Text))
            strWhere = "Address.StartsWith(\"" + txtAddress.Text + "\")";  
        if (!string.IsNullOrEmpty(txtEmpId.Text))
        {
            if(!string.IsNullOrEmpty(strWhere ))
                strWhere = " And ";
            strWhere = "Id = " + txtEmpId.Text;
        }
        if (!string.IsNullOrEmpty(txtDesc.Text))
        {
            if (!string.IsNullOrEmpty(strWhere))
                strWhere = " And ";
            strWhere = "Desc.StartsWith(\"" + txtDesc.Text + "\")";
        }
        if (!string.IsNullOrEmpty(txtName.Text))
        {
            if (!string.IsNullOrEmpty(strWhere))
                strWhere = " And ";
            strWhere = "Name.StartsWith(\"" + txtName.Text + "\")";
        }
    
        EmployeeDataContext edb = new EmployeeDataContext();
        var emp = edb.Employees.Where(strWhere);
        grdEmployee.DataSource = emp.ToList();
        grdEmployee.DataBind();
    

    更多信息可以check this页面。

    【讨论】:

    • 这里没有什么动态的,它只是字符串连接。该字符串恰好在 Dynamic LINQ 中使用,但这不会使字符串本身成为动态的。此外,不要在查询字符串中使用参数,你会一直覆盖strWhere,这样你就不能有多个谓词。这是一个非常糟糕的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多