0

我们正在对组织结构使用问责制模式。我使用 linq 休眠来查找一些部门和职位,但我有两个问题。

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”:“_secretariat.Departments.Select(c => c.PartyId).Contains(p.PartyId)”,并且我得到了 Property not found 'UserName'

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

对不起英语不好!

4

3 回答 3

2

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

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

至于您的直接问题,您可能想尝试加入 _secretariat 而不是尝试子查询。我已经看到它们在子查询不起作用的情况下工作。

于 2009-08-30T07:45:54.187 回答
0

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

_secretariat.Departments.Select(c => c.PartyId).Any(x => x == p.PartyId)
于 2011-05-17T20:44:58.157 回答
0

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

于 2009-08-30T08:58:24.010 回答