2

以下のクエリでは、id で人を選択し、アクティブなアドレスのみを含めたいと考えています。そのクエリをどのように書くのですか? 私が書いたものが正しいかどうかはわかりません

GetQuery()が返されることに注意してくださいIQueryable

var person = repositoryProvider.Repository.GetQuery<Person>()
    .Where(a => a.PersonID == 1234 && a.Addresses.Any(x=>x.IsActive))
    .Include(a => a.Addresses)
    .Include(a => a.Employer)                   
    .SingleOrDefault();
4

1 に答える 1

0

私の読書によると、少なくとも 1 つのアクティブなアドレスがある場合にのみ、クエリは人 1234 のみを取得します。ただし、Person 1234 に関連するすべてのアドレスが含まれます。たとえば、Person 1234 にアクティブなアドレスが 1 つと非アクティブなアドレスが 5 つある場合、Person 1234 の詳細と、アクティブなアドレスだけでなく、合計 6 つのアドレスが取得されます。

あなたの目的のために、サブクエリで十分だと思います。

var person = repositoryProvider.Repository.GetQuery<Person>()
             .Where (a => a.PersonID ==1234)
             .Include(a => a.Address)
             .Include(a => a.Employer)
             .Select (p => new Person { Id = p.Id,  // <-- set the person's properties that you need using the person details that you have extracted.
                      FirstName = p.FirstName,
                      Employer = p.Employer.ToList()
                      Addresses = p.Addresses.Where(a => a.IsActive == true) // <-- transform the resulting entity such that it will only return active addresses
                      }).FirstOrDefault();

別のおそらく読みやすい方法は、2 つの部分に分割することです。最初の部分は、人物の詳細を抽出します。

var person = repositoryProvider.Repository.GetQuery<Person>()
             .Where (a => a.PersonID ==1234)
             .Include(a => a.Addresses)
             .Include(a => a.Employer)
             .Select (p => p);

次に、2 番目の部分で、その人のアドレスをアクティブなアドレスのみに制限します。

person.Addresses = person.Addresses.Where (a => a.IsActive == true).ToList();
于 2013-01-09T09:51:54.790 に答える