【问题标题】:LINQ join query with ICollection使用 ICollection 的 LINQ 连接查询
【发布时间】:2015-06-07 04:40:01
【问题描述】:

我有以下课程:

 public partial class Person : ModificationEntity
{
    public Person()
    {
        this.PersonCompanies = new List<PersonCompany>();
    }

    public System.Guid PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }

    public virtual ICollection<PersonCompany> PersonCompanies { get; set; }
}

public partial class PersonCompany : ModificationEntity
{
    public System.Guid PersonCompanyId { get; set; }
    public System.Guid PersonId { get; set; }
    public System.Guid CompanyId { get; set; }

    public virtual Company Company { get; set; }
    public virtual Person Person { get; set; }
}

我需要查询给定公司 ID 列表的所有用户 (List lstCompanyIds)。

所以我使用以下查询获取所有 PersonCompanyId:

var qpc = (from c in lstCompanyIds
           join u in personCompanyService.GetPersonCompanies()
           on c equals u.CompanyId
           select u.PersonCompanyId).AsQueryable();

通过这个查询,我想获取用户:

var query = from q in GetUsers()
             join q2 in qpc
             on q.PersonCompanies.Select(y => y.PersonCompanyId) equals q2
             select q;

但这会产生一个编译错误“连接子句中的一个表达式的类型不正确。类型推断在调用 'Join' 时失败。” 显然是因为我尝试对个人公司的集合进行选择。但是我该如何正确地做到这一点? (包含也不起作用,因为我有两个要比较的集合......)

【问题讨论】:

  • 你检查过这个问题和解决方案了吗? :stackoverflow.com/questions/19184019/…
  • PersonCompanyIdq2 是否属于同一类型 (System.Guid)?
  • @BurakKarakuş 是的,但不知道这如何解决我的问题。
  • @Loetn 是的,他们是。悬停 Q2 表示:(范围变量)Guid,超过 y.PersonCompany 表示 Guid。
  • 我猜问题是on q.PersonCompanies.Select(y =&gt; y.PersonCompanyId) equals q2 的意思是on IEnumerable&lt;Guid&gt; equals IQueryable&lt;Guid&gt;...无论如何,这对于我来说似乎不正确...

标签: c# linq


【解决方案1】:

你可以试试

    var qpc = (from res in
                      (from c in lstCompanyIds
                       join u in personCompanyService.GetPersonCompanies()
                       on c equals u.CompanyId
                       select u.PersonCompanyId)
                   join u in GetUser()
                  on res equals u.UserId
                  select u).AsQueryable();

我认为这应该可行

确保您要比较的所有 ID 都是 System.Guid 类型

【讨论】:

  • 我做了一些修改,它似乎工作(u.PersonCompanyId => u.PersonId 和 res 等于 u.PersonId)。我必须再测试一些,但似乎有效。
【解决方案2】:

这里的问题是您将IQueryable&lt;Guid&gt;Guid 进行比较。如果我对您的理解正确,那就是您要实现的目标:

IQueryable<Guid> companyIds = Enumerable.Empty<Guid>().AsQueryable(); //qpc in your question
IQueryable<Person> persons = Enumerable.Empty<Person>().AsQueryable(); //q in your question
var result = persons.Where(person => person.PersonCompanies
            .Any(company => companyIds.Contains(company.CompanyId)));

【讨论】:

  • 我试过这个,但没有得到任何重新调整的结果(它应该)。我正在努力解决这个问题。
  • @JurgenStillaert 两个输入集合都是非空的,你没有得到异常和错误,但结果是空的?
猜你喜欢
  • 2010-10-27
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 2015-01-23
相关资源
最近更新 更多