2009-04-23 62 views
5

比方说,我有图纸和资料LINQ to SQL和加入两个表或条款

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

我已经构造的地方,为每个PredicateBuilder条款。所以,myPlans和myDocuments有一个正确的SQL语句。

我想要做的是将这两个表加入到一个linq语句中。我遇到的问题是,默认情况下,AND条件是加入where子句。 (p.name为“%test%”,p.name为“%bed%”)或(p.description如“%test%”)和p.description如“%bed%” )

myDocuments Where子句:(d.name像“%test%”和d.name像“%bed%”)OR(d.description像“%test%”)和d.description像“%bed% “)

当我将二者结合起来的期望结果WHERE子句:
凡(d.ID = p.ID)AND (myplans where子句上文)OR(myDocument中where子句上文)。意思是,我希望每个表格中的两个子句都是“或”而不是“和”。

当前结果where子句是: 凡(d.ID = p.ID)AND (myplans where子句上文)AND(myDocument中where子句上文)。意思是,我希望每个表格中的两个子句都是“或”而不是“和”。

我形成的声明是这样的:

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

回答

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 
2

这是发生,因为你正在做一个“第一关”,其过滤匹配您的谓词的计划和文件,并然后只有加入这些成果,有效地做一个AND。就像巴西利奥说的那样,你应该在同一个过程中进行加入/过滤。你可以尝试这样的事:

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 
+0

我喜欢你的答案了。 +1 – 2009-04-25 22:02:55