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