LINQ to SQL и объединение двух таблиц с предложением OR - PullRequest
5 голосов
/ 24 апреля 2009

Допустим, у меня есть планы и документы

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

Я структурировал предложение where для каждого, используя PredicateBuilder. Итак, myPlans и myDocuments имеют правильный оператор SQL.

Я хотел бы объединить эти две таблицы в один оператор 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%")

Когда я объединяю два, желаемый результат, где предложение:
Где (d.ID = p.ID) И (myplans, где пункт выше) ИЛИ (мой документ, где пункт выше). То есть мне бы хотелось, чтобы два предложения where в каждой из таблиц были "или" вместо "And".

Текущий результат, где предложение: Где (d.ID = p.ID) И (myplans, где пункт выше) И (мой документ, где пункт выше). То есть мне бы хотелось, чтобы два предложения where в каждой из таблиц были "или" вместо "And".

Я формирую утверждение так:

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

Ответы [ 2 ]

3 голосов
/ 25 апреля 2009

Чтобы достичь желаемого результата, вам нужно выполнить фильтрацию предикатов и присоединиться к одному выражению.

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 голосов
/ 25 апреля 2009

Это происходит потому, что вы выполняете «первый проход», который фильтрует планы и документы, соответствующие вашим предикатам, и , а затем объединяет только эти результаты, фактически выполняя 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
...