Linq.NHibernate проблема с оператором ИЛИ - PullRequest
1 голос
/ 01 декабря 2009

ПРИМЕЧАНИЕ: весь код написан в верхней части моей головы. Может содержать некоторые ошибки. Просто получите общий смысл этого вопроса)

Принимая это определение класса: (уменьшено для простоты)

public class CodedValue
{
  public string Code { get; set; }
  public string Value {get; set; }
}

Взятие этих предметов:

CodedValue cv1 = new CodedValue(){ Code = "A",  Value = "1" };
CodedValue cv2 = new CodedValue(){ Code = "B",  Value = "2" };
IList<CodedValue> cvList = new List<CodedValue>();
cvList.Add(cv1);
cvList.Add(cv2);

cvList содержит список CodedValue для фильтрации.

Предположим, что моя база данных содержит эти записи:

CODE     VALUE
A        1
A        2
B        1
B        2

Теперь я хочу получить все объекты с кодовым значением в списке

var filter = from o in MyRepository.List()
             where cvList.Contains(o.CodedValue)
             select o;

NHibernate перевести этот Linq к этому:

select [Fields...] from [Table...]
where Code in ('A', 'B') and Value in ('1', '2');

Это неправильно. Если вы посмотрите на мой пример записей, этот SQL вернет все строки. SQL должен быть переведен на:

select [Fields...] from [Table...]
where (Code = 'A' and Value = '1') or (Code = 'B' and Value = '2');

Итак, могу ли я получить желаемый результат с помощью Linq? Если так, то как? Если нет, то как мне этого добиться?

Спасибо

1 Ответ

5 голосов
/ 02 декабря 2009

Хорошо, вот решение!

Я использую PredicateBuilder с этого сайта: PredicateBuilder

Затем я строю предикат:

var expr = PredicateBuilder.False<Audit>();

foreach(CodedValue codedValue in auditEventIds)
{
  CodedValue cv = codedValue;
  expr = expr.Or(a => (a.EventId.Code == cv.Code) && (a.EventId.CodeSystemName == cv.CodeSystemName));
}

itemQuery = itemQuery.Where(expr);

Строка CodedValue cv = codedValue в операторе foreach ОЧЕНЬ ВАЖНА. Пропуск строки создаст правильный синтаксис SQL, но значения параметров будут одинаковыми для всех.

Я действительно надеюсь, что это кому-нибудь поможет.

...