首页 文章

如何使用for循环创建动态查询?

提问于
浏览
0

我想根据输入的数字动态创建查询并将其设置为数组以从视图中获取数据,因此我可以创建条件来过滤它,但我的查询仅适用于 3 输入的数字 .

var query = from bs in dc.VwResourceAssignments select bs;

var listReqNumber = new[] {123, 456, 789};

我目前的查询是:

if (listReqNumber.Length == 1)
{
    query = query.Where(p => p.RequisitionNumber.Contains(listReqNumber[0]));
}
else if (listReqNumber.Length == 2)
{
    query = query.Where(p => p.RequisitionNumber.Contains(listReqNumber[0]) ||
                             p.RequisitionNumber.Contains(listReqNumber[1]));
}
else if (listReqNumber.Length == 3)
{
    query = query.Where(p => p.RequisitionNumber.Contains(listReqNumber[0]) ||
                             p.RequisitionNumber.Contains(listReqNumber[1]) ||
                             p.RequisitionNumber.Contains(listReqNumber[2]));
}

有没有办法让它动态,所以我可以输入我想要的申请号码?

4 回答

  • 1

    让我们概括一下这个问题:如果我们想要实现一个任意的 listReqNumber 数组

    query = query.Where(
       p => p.RequisitionNumber.Contains(listReqNumber[0]) ||
            p.RequisitionNumber.Contains(listReqNumber[1]) || 
            ...
            p.RequisitionNumber.Contains(listReqNumber[listReqNumber.Length - 1])
    );
    

    或者 - 让我们摆脱 || - 我们希望 p.RequisitionNumber 中包含 any 项目 reqlistReqNumber

    // doesn't compile - just the idea   
     query = query.Where(p => p.RequisitionNumber.Contains(any req in listReqNumber));
    

    可惜,我们不能把 any req in listReqNumber 但我们可以交换 listReqNumberp.RequisitionNumber 并最终有一个有效的查询:

    query = query.Where(p => listReqNumber.Any(req => p.RequisitionNumber.Contains(req)));
    
  • 0

    如果你这样直接使用怎么样:

    var result = from p in query where listReqNumber.Contains(p.RequisitionNumber) select p;
    
  • 0
    var data = query.Where(q =>
      q.RequisitionNumber.Any(w => listReqNumber.Contains(w))
    );
    
  • 0

    您可以使用动态linq . 链接在这里:https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library

    然后有一个像下面这样的功能:

    string GetQuery(int num)
    {
        return $"p.RequisitionNumber.Contains(listReqNumber[{num}])";
    }
    

    在Main中创建如下的查询:

    string testQuery = string.Empty; // or use StringBuilder then convert to string.
    int length = 4;
    for (int temp = 1; temp <= length; temp ++)
         testQuery += testQuery.Length == 0 ? GetQuery(temp - 1) : " || " + GetQuery(temp);
    

    然后使用动态linq像:

    var query = northwind.Products
                             .Where(testQuery).OrderBy("SupplierID");
    

相关问题