【问题标题】:How to set where condition on parent and child table如何在父子表上设置where条件
【发布时间】:2012-12-11 20:07:38
【问题描述】:

在下面的查询中,我想通过其 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();

【问题讨论】:

  • 您不确定哪一部分?当你测试它时,你得到了你想要的结果吗?
  • 下面是非工作查询。查询返回该包的所有 PackageDetails var package = repositoryProvider.Repository.GetQuery() .Where(a => a.PackageID == 1234 && a.PackageDetails .Any(x => x.IsExcludedFlag == false)) .Include(a => a.PackageBatch) .Include(a => a.PackageDetails.Select(b => b.Document)) .Include(a => a.PackageSendHistories) .Include(a => a.PackageSendHistories.Select(b => b.CompanyUser)) .SingleOrDefault();
  • 对不起,我不知道正确格式化此代码的技巧

标签: linq linq-to-sql linq-to-entities


【解决方案1】:

根据我的阅读,您的查询仅在具有至少一个活动地址的情况下才获得人 1234。但是,它将包括与人员 1234 相关的所有地址。例如,如果人员 1234 有一个活动地址和五个非活动地址,您将获得人员 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2021-09-20
    • 2019-08-13
    • 2021-02-22
    • 2022-11-14
    相关资源
    最近更新 更多