LINQ to SQL и объединение двух таблиц с предложением OR

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

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 item : (d.name, например, "%test%" И d.name, например, "%bed%") ИЛИ (d.description, например, "%test%" И d.description, например, "%bed%")

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

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

Я формирую заявление следующим образом:

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

person sugarcrum    schedule 23.04.2009    source источник


Ответы (2)


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

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
person Jose Basilio    schedule 25.04.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
person Lucas    schedule 25.04.2009