linq中的自定义OR功能

时间:2018-01-03 14:17:40

标签: c# linq lambda

我有一个linq to sql表达式,我想在其中使用OR表达式。

我有两个名为AB的表格,我在名为AB的表格中有一个关系,其中包含字段A_IdB_Id和号码为State

用户可以使用特定B的{​​{1}}对创建一对请求。我应该返回与这些对匹配的所有State

示例:

A

并且请求包含以下对:

A_Id | B_Id | State
-------------------
1    | 101  | 1001
2    | 102  | 1002
3    | 103  | 1003
3    | 101  | 1003

并且对的数量可能更多。

我的查询仅针对一对B_Id: 101 and State: 1001 OR B_Id: 103 and State: 1003 B

State

如果我有更多配对,我应该或他们这样:

int b_Id = 101;
int state = 1001;
var query = dbContext.As.Where(a => dbContext.ABs.Any(ab => ab.A_Id == a.Id && ab.B_Id == b_Id && ab.State == state);

但是我可能会有更多的配对而且我不能那样处理它。

我怎样才能有... (ab.B_Id == b_Id[0] && ab.State == state[0]) || (ab.B_Id == b_Id[1] && ab.State == state[1]) || ... 之类的东西可以通过更多对来获得完整的结果?

1 个答案:

答案 0 :(得分:3)

您可以使用PredicateBuilder中的LinqKit动态生成查询的Where谓词。

快速(LINQPad)demo

enter image description here

void Main()
{
    var data = new List<DataRow>()
    {
        new DataRow { A = 1, B = 101, State = 1001 },
        new DataRow { A = 2, B = 102, State = 1002 },
        new DataRow { A = 3, B = 103, State = 1003 },
        new DataRow { A = 4, B = 104, State = 1004 },
    };

    var searchTerms = new List<SearchData>()
    {
        new SearchData {B=101, State=1001},
        new SearchData {B=103, State=1003},
    };

    var predicate = PredicateBuilder.New<DataRow>();
    foreach (var term in searchTerms)
    {
        predicate = predicate.Or(p=> p.B == term.B && p.State == term.State);
    }

    var query = data.Where(predicate);

    query.Dump();
}

public class DataRow
{
    public int A { get; set; }
    public int B { get; set; }
    public int State { get; set; }
}

public class SearchData
{
    public int B { get; set; }
    public int State { get; set; }
}

如果在实体框架中使用,则需要稍微修改此内容,方法是在第一个表格中调用AsExpandable,例如MyDbContext.MyTable.AsExpandable().Where()