LINQ to SQL查询中的C#Dynamic WHERE子句

问题描述 投票:3回答:4

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

这可能吗?

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

有人有什么建议吗?

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


private struct ProductStruct
        {
            public long ProductID;
        }

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

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

List productList = new List();

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 filterList = new List();
                    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 productList = new List();
                    productList = (from pfv in dataConnection.ProductFieldValues.Where(whereClause)
                                    select new ProductStruct
                                          {
                                          ProductID = pfv.ProductID
                                          }).ToList();

            } 
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

        }


thanks in advance

.net sql-server-2005 linq-to-sql c#-3.0
4个回答
4
投票

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

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

linq using string as where statement


0
投票

您可以使用JOIN子句:

from pfv in dC.ProductFieldValues
join filter in filterList on (
    pfv.ProductTypeFieldID == filter.ProductTypeFieldID 
    && pfv.ValueNumber == filter.ValueNumber
)
select new ProductStruct                           
{                               
    ProductID = pfv.ProductID                           
}

0
投票

这是一个在VB中使用IQueryable的简单示例。

Private Function GetZeroScoreWhere(ByVal qry As IQueryable(Of ScoreTest), ByVal score As ScoreTest) As IQueryable(Of ScoreTest)
    If score.CallType = ScoreTest.CallTypeEnum.XXX Then
        Return qry.Where(Function(c) c.AvgScore.Value = 0 Or c.Zero.Trim <> String.Empty)
    End If

    Return qry.Where(Function(c) c.ValidScore.Value = 0)
End Function

C#中的代码相同:

private IQueryable<ScoreTest> GetZeroScoreWhere(IQueryable<ScoreTest> qry, ScoreTest score)
{
    if(score.CallType == ScoreTest.CallTypeEnum.XXX)
    {
        Return qry.Where(c => c.AvgScore.Value == 0 || c.Zero.Trim != String.Empty)
    }

    Return qry.Where(c => c.ValidScore.Value == 0)    
}

0
投票

我在类似问题中得到的答案对我有用:

How do you add dynamic 'where' clauses to a linq query?

(答案是使用Predicate Builder

© www.soinside.com 2019 - 2024. All rights reserved.