我们正在使用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!
答案 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)