linq中的复杂查询为nhibernate

时间:2009-08-30 07:19:19

标签: linq-to-nhibernate

我们正在使用accountability pattern来组织结构。我使用linq来nhibernate找到一些部门和职位,但我有两个问题。

var query = 
  Repository<Party>.Find(p => p.IsInternal == true)
    .Where(p => p.Parents.Any(c => c.Parent.PartyId == id))
    .Where(p => 
      (
        p.PartyType.PartyTypeId == (int)PartyTypeDbId.Department && 
        _secretariat.Departments.Select(c => c.PartyId).Contains(p.PartyId)
      )
      || 
      (
        p.PartyType.PartyTypeId == (int)PartyTypeDbId.Position && 
        p.Children.Any(c => 
          c.AccountabilityType.AccountabilityTypeId == (int)AccountabilityTypeDbId.TenurePersonOfPosition &&  
          ((Person)c.Child).UserName != null)
        )
    );

首先:对于这部分查询,我得到了“未处理的表达式类型:1003”:'_ secretcret.Departments.Select(c =&gt; c.PartyId).Contains(p.PartyId)' 我找不到'用户名'

的财产

我认为我们需要使用存储过程的许多复杂查询。

抱歉Inglish!

3 个答案:

答案 0 :(得分:2)

使用LINQ可以做的一件好事就是将查询分成多个部分。由于您构建的表达式树在枚举结果之前不会执行,因此您不必在一行中完成所有操作(如SQL)。

您甚至可以制作一些可以应用于IQueryable的可重复使用的“过滤器”。这些过滤器函数接受IQueryable作为参数,并返回一个作为结果。如果你喜欢(我喜欢),你可以将它们构建为扩展方法。

至于你当前的问题,你可能想尝试加入_secretariat而不是尝试子查询。我已经看到它们在子查询没有的情况下工作。

答案 1 :(得分:0)

除了Lance的评论之外,您可能还需要查看已编译的Linq查询并分解一些遵循SOLID原则的责任。

答案 2 :(得分:0)

我还发现包含Any linq方法时Contains存在问题。但是,Any似乎在Any中运行良好,因此:

_secretariat.Departments.Select(c => c.PartyId).Any(x => x == p.PartyId)