LINQ to SQL和使用OR子句连接两个表

时间:2009-04-23 22:11:21

标签: vb.net linq linq-to-sql where

假设我有计划和文件

Dim myPlans = _context.Plans.Where(predicate1)
Dim myDocuments = _context.Documents.Where(predicate2)

我使用PredicateBuilder为每个子句构造了where子句。因此,myPlans和myDocuments有一个正确的SQL语句。

我想要做的是将这两个表连接成一个linq语句。我遇到的问题是,默认情况下AND条件加入where子句。

myPlans Where子句:( p.name喜欢“%test%”和p.name喜欢“%bed%”)OR(p.description like“%test%”AND p.description like“%bed%”)

myDocuments Where子句:( d.name喜欢“%test%”和d.name喜欢“%bed%”)或(d。描述如“%test%”和d.description如“%bed%”)

当我将所需的结果组合起来时Where子句是:
其中(d.ID = p.ID)AND (上面的myplans where子句) OR (上面的mydocument where子句)。这意味着,我希望每个表中的两个where子句都是“或”而不是“And”。

当前结果where子句是: 其中(d.ID = p.ID)AND (上面的myplans where子句) AND (上面的mydocument where子句)。这意味着,我希望每个表中的两个where子句都是“或”而不是“And”。

我正在形成这样的陈述:

Dim test = From d in myDocuments _
           Join p in MyPlans on d.ID Equals p.ID _
           Select d.Name, p.Name

2 个答案:

答案 0 :(得分:3)

为了达到理想的结果,你需要在单个语句中进行谓词过滤和连接。

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

答案 1 :(得分:2)

这种情况正在发生,因为您正在进行“第一次通过”,过滤与您的谓词匹配的计划和文档,然后仅加入这些结果,有效地执行AND。像Basilio说的那样,你应该在同一个传球中进行加盟/过滤。您可以尝试这样的事情:

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