2009-04-23 91 views
5

Digamos que tengo los planos y documentosLINQ a SQL y unir dos tablas con la cláusula OR

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

He estructurado la cláusula where para cada uso de PredicateBuilder. Entonces, myPlans y myDocuments tienen una declaración SQL correcta.

Lo que me gustaría hacer es unir estas dos tablas en una sola instrucción linq. El problema que tengo es que, por defecto, la condición AND se une a las cláusulas where.

myPlans Where cláusula: (p.name como "% test%" AND p.name como "% bed%") O (p.description como "% test%" AND p.description like "% bed%")

myDocuments Where cláusula: (d.name like "% test%" AND d.name like "% bed%") O (d.description como "% test%" AND d.description like "% bed% ")

Cuando combino el resultado dos la deseada cláusula WHERE es:
donde (d.ID = p.ID) y (myplans donde cláusula anterior) O (mydocument donde cláusula anterior). Es decir, me gustaría que las dos cláusulas where de cada una de las tablas sean "o" en lugar de "Y".

El resultado actual en la cláusula es: Donde (d.ID = p.ID) y (myplans donde cláusula anterior) Y (mydocument donde cláusula anterior). Es decir, me gustaría que las dos cláusulas where de cada una de las tablas sean "o" en lugar de "Y".

Estoy formando la sentencia como esta:

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

Respuesta

3

Con el fin de lograr el resultado deseado, es necesario hacer los filtrados precedentes y se une en el único comunicado.

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

Esto sucede porque usted está haciendo un "primer paso" que filtra los planos y documentos que coincidan con sus predicados, y luego unirse a esos resultados solamente, haciendo efectiva una AND. Como dijo Basilio, deberías hacer tu unión/filtro en el mismo pase. Se podría intentar algo como esto:

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 

O parecida:

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

me gusta su respuesta también. +1 –

Cuestiones relacionadas