Использовать выражение> в Linq на MyEntity. <OtherEntity>. <MyProperty> - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь упростить метод, который возвращает IQueryable

A, B и C, расширяют BaseEntity, содержащий перечисление, которое я хочу сравнить. context является структурой сущности dbcontext.

Вот упрощенная версия метода:

 return context.MyEntities.Include("A").Include("B").Include("C")
        .Where(x => x.A.MyEnum == MyEnum.<value> && x.B.MyEnum == MyEnum.<value> && x.C.MyEnum == MyEnum.<value>);

Я пытался сделать это:

Func<BaseEntity, bool> equals = x => x.MyEnum == MyEnum.<value>;

return context.MyEntities.Include("A").Include("B").Include("C")
        .Where(x => equals(x.A) && equals(x.B) && equals(x.C));

Он компилируется, нодает ошибку во время выполнения. Насколько я понимаю, что Linq не может перевести func <> в SQL? Поэтому я искал и обнаружил, что вам нужно обернуть func <> в выражение <>, чтобы Linq мог скомпилировать его и преобразовать в SQL.

Теперь у меня есть это:

Expression<Func<BaseEntity, bool>> equals = x => x.MyEnum == MyEnum.<value>;

return context.MyEntities.Include("A").Include("B").Include("C")
        .Where(x => equals(x.A) && equals(x.B) && equals(x.C));

Но это не компилируется: «Ожидается имя метода». Есть ли способ выполнить то, что я пытаюсь сделать?

1 Ответ

1 голос
/ 30 сентября 2019

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

equals.Compile()(x.A)

Но это противоречит цели использования выражения для начала.

Ничего нельзя упростить в предоставленном коде, кроме перемещения повторного вызова значения в переменную.

var value = MyEnum.<value>;
return context.MyEntities.Include("A").Include("B").Include("C")
    .Where(x => x.A.MyEnum == value && x.B.MyEnum == value && x.C.MyEnum == value);

Попытка упростить то, что было показано, на самом деле не нужна.

...