Vb.net LINQ到SQL并使用OR子句连接两个表
假设我有计划和文件Vb.net LINQ到SQL并使用OR子句连接两个表,vb.net,linq,linq-to-sql,where,Vb.net,Linq,Linq To Sql,Where,假设我有计划和文件 Dim myPlans = _context.Plans.Where(predicate1) Dim myDocuments = _context.Documents.Where(predicate2) 我已经使用PredicateBuilder为每个项目构造了where子句。因此,myPlans和myDocuments有一个正确的SQL语句 Dim myCriteria() = {"test", "bed"} Dim test = from d in _context.D
Dim myPlans = _context.Plans.Where(predicate1)
Dim myDocuments = _context.Documents.Where(predicate2)
我已经使用PredicateBuilder为每个项目构造了where子句。因此,myPlans和myDocuments有一个正确的SQL语句
Dim myCriteria() = {"test", "bed"}
Dim test = from d in _context.Documents _
join p in _context.Plans on d.ID Equals p.ID _
where (myCriteria.Contains(d.Name) OR _
myCriteria.Contains(d.Descrition)) _
OR (myCriteria.Contains(p.Name) OR _
myCriteria.Contains(p.Description)) _
select Document = d.Name, Plan = p.Name
我要做的是将这两个表连接到一个linq语句中。我遇到的问题是,默认情况下,AND条件是加入where子句
myPlans Where子句:(p.name如“%test%”和p.name如“%bed%”)或(p.description如“%test%”和p.description如“%bed%”)
myDocuments Where子句:(d.name类似于“%test%”,d.name类似于“%bed%”)或(d.description类似于“%test%”,d.description类似于“%bed%”)
当我将两者结合起来时,所需的结果Where子句是:其中(d.ID=p.ID)和 (上文第条所述我的计划)或(上文第条所述我的文件)。意思是,我希望每个表中的两个where子句都是“or”,而不是“And” 当前结果where子句为: 其中(d.ID=p.ID)和 (上文第条所述我的计划)和(上文第条所述我的文件)。意思是,我希望每个表中的两个where子句都是“or”,而不是“And” 我的陈述是这样的:
Dim test = From d in myDocuments _
Join p in MyPlans on d.ID Equals p.ID _
Select d.Name, p.Name
Dim test = From d in _context.Documents _
Join p in _context.Plans on d.ID Equals p.ID _
Where predicate1(p) Or predicate2(d)
Select d.Name, p.Name
为了获得所需的结果,需要对单个语句进行谓词筛选和联接
Dim myCriteria() = {"test", "bed"}
Dim test = from d in _context.Documents _
join p in _context.Plans on d.ID Equals p.ID _
where (myCriteria.Contains(d.Name) OR _
myCriteria.Contains(d.Descrition)) _
OR (myCriteria.Contains(p.Name) OR _
myCriteria.Contains(p.Description)) _
select Document = d.Name, Plan = p.Name
发生这种情况的原因是,您正在进行“第一次传递”,过滤与谓词匹配的计划和文档,然后仅合并这些结果,有效地执行
和
。正如Basilio所说,您应该在同一过程中完成加入/筛选。您可以尝试以下方法:
Dim test = From d in myDocuments _
Join p in MyPlans on d.ID Equals p.ID _
Select d.Name, p.Name
Dim test = From d in _context.Documents _
Join p in _context.Plans on d.ID Equals p.ID _
Where predicate1(p) Or predicate2(d)
Select d.Name, p.Name
或类似地:
Dim test = From d in _context.Documents _
From p in _context.Plans _
Where d.ID = p.ID And (predicate1(p) Or predicate2(d))
Select d.Name, p.Name