LINQ Projection в Entity Framework - PullRequest
       1

LINQ Projection в Entity Framework

2 голосов
/ 16 апреля 2011

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

Я хочу выполнить простой запрос, в котором получить ChildProdcut по номеру sku и PriceTiers, отфильтрованные по IsActive.

Dim ChildProduct = ChildProductRepository.Query.
            Where(Function(x) x.Sku = Sku).
            Select(Function(x) New With {
                       .ChildProduct = x,
                       .PriceTiers = x.PriceTiers.
                       Where(Function(y) y.IsActive).
                       OrderBy(Function(y) y.QuantityStart)
                   }).Select(Function(x) x.ChildProduct).Single

Есть ли более эффективный способ сделать это? Я на правильном пути вообще? Это работает.

Еще одна вещь, которую я действительно не понимаю, почему это работает? Вам просто нужно загрузить граф объектов, и EF обнаружит это и увидит, что эти коллекции принадлежат ChildProduct, даже если они находятся внутри анонимного типа?

Кроме того, каковы стандарты форматирования длинного выражения LINQ?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2011

Is there a more efficient way of doing this? I am on the right track at all?

Нет, это примерно так, как вы делаете это в EF, и да, вы на правильном пути.

Another thing I really don't understand is why does this work?

Этосчитается хакером, но он работает, потому что EF анализирует все выражение и генерирует один запрос (он будет выглядеть примерно так же, как если бы вы только что использовали Include, но с фильтрованной коллекцией PriceTiers).В результате вы получите ChildProducts с PriceTiers заполненным (и правильно отфильтрованным).Очевидно, что вам не нужно свойство PriceTiers вашего анонимного класса (вы отбрасываете его, просто выбирая x.ChildProduct), но добавление его в запрос LINQ говорит EF добавить join и дополнительный where ксгенерированный SQL.В результате ChildProduct содержит все, что вам нужно.

0 голосов
/ 17 апреля 2011

Если эта функция критична, создайте хранимую процедуру и свяжите с ней структуру сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...