.net - LINQ to SQL 查询中的 C# 动态 WHERE 子句

标签 .net sql-server-2005 linq-to-sql c#-3.0

我想使用动态 where 子句执行 LINQ 查询,具体取决于用户为其条件输入了多少个不同的选项。

这可能吗?

我已经在下面发布了我希望它如何工作的代码。

有人有什么建议吗?

附言我尝试使用 .Contains 方法(在 SQL 上生成 WHERE IN,但是参数数量超过 2100 阈值并导致错误“LINQ 传入表格数据流 (TDS) 远程过程调用 (RPC) 协议(protocol)流不正确. 此RPC 请求中提供的参数太多。最大为2100"。

private struct ProductStruct
{
    public long ProductID;
}

private struct FilterStruct
{
    public long ProductTypeFieldID;
    public long ValueNumber;
}

List<FilterStruct> filterList = new List<FilterStruct>();
filterList.Add(new FilterStruct { ProductTypeFieldID = 3, ValueNumber = 195 });
filterList.Add(new FilterStruct { ProductTypeFieldID = 8, ValueNumber = 55 });
 
List<ProductStruct> productList = new List<ProductStruct>();
 
productList = (from pfv in dC.ProductFieldValues
                           where
                                foreach (FilterStruct filter in filterList)
                                {
                                    pfv.ProductTypeFieldID == filter.ProductTypeFieldID
                                    && pfv.ValueNumber == filter.ValueNumber
                                }
                           select new ProductStruct
                           {
                               ProductID = pfv.ProductID
                           }).ToList();

编辑

这看起来好像很方便,但不适用于动态位置?

private void Option2()
{
    try
    {
        LinqDataDataContext dataConnection = new LinqDataDataContext(ConnectionString);

        List<FilterStruct> filterList = new List<FilterStruct>();
            filterList.Add(new FilterStruct { ProductTypeFieldID = 3, ValueNumber = 195 });
            filterList.Add(new FilterStruct { ProductTypeFieldID = 8, ValueNumber = 55 });

        string whereClause = null;
        foreach (FilterStruct filter in filterList)
        {
            if (whereClause != null)
                whereClause += "AND ";

            whereClause += string.Format("ProductID IN (SELECT ProductID FROM ProductFieldValue WHERE ProductTypeFieldID = {0} AND ValueNumber = {1})", filter.ProductTypeFieldID, filter.ValueNumber);
        }

        List<ProductStruct> productList = new List<ProductStruct>();
            productList = (from pfv in dataConnection.ProductFieldValues.Where(whereClause)
                            select new ProductStruct
                                  {
                                  ProductID = pfv.ProductID
                                  }).ToList();
    } 
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

最佳答案

从此处接受的答案:How do I build up LINQ dynamically

这适用于 .AsQueryable() 类,但如果您使用“as iQueryable()”,则可以使用 .Enumerable() 类

linq using string as where statement

关于.net - LINQ to SQL 查询中的 C# 动态 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1306129/

相关文章:

c# - 系统.Data.SqlClient.SqlException : Column name or number of supplied values does not match table definition

SQL SERVER 2005 USE 语句

sql - 有没有更好的方法来进行这种连接?

linq-to-sql - 使用 Linq to SQL 和 Sql Reporting Services

跨多个数据库的 LINQ

asp.net-mvc - ASP.Net MVC - View 中的空对象

c# - 使用静态类型语言 (F#) 处理异构数据

c# - 如何在 .NET 中实现作业队列?

c# - 将一个类复制到另一个?

sql-server-2005 - 您认为该存储过程模板有任何问题吗?