我有一个linq to sql表达式,我想在其中使用OR表达式。
我有两个名为A
和B
的表格,我在名为AB
的表格中有一个关系,其中包含字段A_Id
,B_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]) || ...
之类的东西可以通过更多对来获得完整的结果?
答案 0 :(得分:3)
您可以使用PredicateBuilder
中的LinqKit
动态生成查询的Where
谓词。
快速(LINQPad)demo:
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()
。