2012-12-11 11 views
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(); 
+0

哪一部分您不确定?当你测试它时,你是否得到了你想要的结果? – Magnus

+0

下面是非工作query.Query返回该包的所有PackageDetails var package = repositoryProvider.Repository.GetQuery () .Where(a => a.PackageID == 1234 && a.PackageDetails.Any(x => x包含(a => a.PackageBatch) 。包含(a => a.PackageDetails.Select(b => b.Document)) .Include(a => a.PackageSendHistories).IsExcludedFlag == false)) 。 (a => a.PackageSendHistories.Select(b => b.CompanyUser)) .SingleOrDefault(); – Laksh

+0

即时通讯抱歉,但我不知道正确格式化此代码的技巧 – Laksh

回答

0

从我的阅读,您的查询,仅得到1234人只有当至少有一个活动的地址。但是,它将包含与Person 1234相关的所有地址。例如,如果Person 1234有一个活动地址和五个不活动地址,则您将获得Person 1234的详细信息以及其六个总地址,而不仅仅是活动地址。

为了您的目的,我在考虑一个子查询。

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(); 

另一种可能更容易阅读的方法是将其分解成两部分。第一部分将提取人的细节:

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

,然后第二部分限制了人的地址,仅在活动地址:

person.Addresses = person.Addresses.Where (a => a.IsActive == true).ToList();