Как вернуть все записи и существует ли связанная запись? - PullRequest
0 голосов
/ 23 декабря 2010

Использование Entity Framework 4 CTP5 У меня есть базовая модель и базовый DbContext, который работает

public class Customer {
  public int CustomerId { get; set; }
  public int Name { get; set; }
  //...
  public ICollection<Address> Addresses { get; set; }
  public bool HasAddress {
    get {
      return Addresses.Count > 0;
    }
  }
}

public class Address {
  public int AddressId { get; set; }
  public string StreetLine1 { get; set; }
  //....
  public Customer Customer { get; set; }
}

Как я могу запросить мой DbContext, чтобы вернуть всех клиентов и есть ли у них адрес?

У клиента может быть несколько адресов, и я не хочу возвращать все адреса для каждого клиента, когда меня интересует, есть ли у него адрес или нет.Я использую context.Customers.Include(c => c.Addresses), но это возвращает все адреса для каждого клиента

1 Ответ

3 голосов
/ 23 декабря 2010

Имейте в виду, чтобы определить , если у Клиента есть адреса, на сервере должна быть выполнена агрегированная операция (COUNT). Я не думаю, что вы можете использовать это свойство HasAddress непосредственно в предикате LINQ, поскольку агрегатные операции AFAIK нельзя использовать в предикатах LINQ-Entities.

Так что, возможно, вам придется сделать что-то вроде этого:

var result = ctx.Customers.Select(x => new
                                  {
                                     Customer = x,
                                     HasAddress = x.Addresses.Count() > 0
                                  }).ToList();

Это вернет коллекцию из анонимных типов , включая всех клиентов и наличие у них хотя бы одного адреса.

Обратите внимание на () на счетчике - он выполняет фактическую операцию агрегирования, тогда как .Count является операцией LINQ на стороне клиента.

НТН.

EDIT

Если вы хотите поместить этот анонимный тип обратно в объект Customer, вы можете сделать это после запроса (как, например, проверка выполнения .Count() в базе данных):

var result = ctx.Customers.Select(x => new
                                      {
                                         Customer = x,
                                         HasAddress = x.Addresses.Count() > 0
                                      }).ToList()
                                      .Select(x => new Customer
                                      {
                                         // left to right copy....
                                         HasAddress = true
                                      }).ToList();

Это довольно грязное ИМО, но оно будет работать.

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