EF выражение пользовательского селектора - PullRequest
1 голос
/ 24 октября 2011

У меня есть следующий простой сценарий.У меня есть класс Customer, который определен в моем edmx.У меня также есть класс Order, и у клиента может быть ноль или более заказов через его свойство Orders.

Я определил свойство OrderCount в своем классе Customer следующим образом:

public partial class Customer
{
    public int OrderCount { get; set; }
}

Iхотел бы легко написать запросы Select, которые загружают значение этого OrderCount соответствующим образом.Я попытался сделать это в классе Customer:

public partial class Customer
{
    public int OrderCount { get; set; }

    public static Expression<Func<Customer, Customer>> DetailSelector = c =>
        {
            c.OrderCount = c.Orders.Count;
            return c;
        };
}

И затем запрос на выборку:

var customersWithOrderCount = ctx.Customers.Select(Customer.DetailSelector);

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

public partial class Customer
{
    public int OrderCount { get; set; }

    public static Expression<Func<Customer, Customer>> DetailSelector = c => Customer.LoadDetail(c);

    public static Customer LoadDetail(Customer customer)
    {
        customer.OrderCount = customer.Orders.Count;

        return customer;
    }
}

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

LINQ to Entities does not recognize the method 'Customer LoadDetail(Customer)' method, and this method cannot be translated into a store expression.

Какой самый простой способ сделать это?

ОБНОВЛЕНИЕ: Просто для пояснения, я специально ищу способ сделать это с помощью выражения.Поэтому я не хочу загружать заказы из базы данных, я просто хочу заполнить свойство OrderCount.Спасибо,

1 Ответ

0 голосов
/ 24 октября 2011

Это немного упрощенно, но я думаю, что это базовый рабочий дизайн для сущностей.ИМХО лучшим способом является использование .Order.Count.Если вы извлекаете его оттуда, почему бы не оставить его там?

Если вы хотите писать запросы на выборку, включите значение из Customers.Orders напрямую, и для вас будет сгенерирован правильный SQL.В противном случае я бы лично включил это значение в класс CustomerRepository сразу после загрузки клиента.Тогда вы всегда получаете своего клиента из одного места и знаете его набор (конечно, подразумевается использование шаблона репозитория)

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