【发布时间】:2011-08-24 14:14:04
【问题描述】:
我有一些 Linq 查询。从语义上讲,它们是
a join b join c join d where filter1(a) && filter2(c) && filter3(d)
a join b join c where filter1(a) && filter2(c)
a 连接 b 连接 c 连接 e where filter1(a) && filter2(c) && filter4(e)
...
我希望能够排除共享部分:
a join b join c where filter1(a) && filter2(c)
并动态追加join d和filter3(d)
有没有办法做到这一点?我已经在使用 Predicate Builder 来动态构建条件(过滤器)。
编辑:我正在使用 Linq-to-SQL。
编辑:基本查询如下所示:
from a in As.AsExpandable()
join b in Bs on a.Id equals b.PId
join c in Cs on b.Id equals c.PId
where filter1(a) && filter2(b) && filter3(c)
select new A { ... }
过滤器是谓词生成器中的谓词。查询类型为IQueryable<A>。
接下来,我想和 d 一起参加这个活动
from a in BaseQuery()
join d in D on a.Id equals d.PId
目前join d .. 导致编译错误:
join 子句中的一个表达式的类型不正确。调用 Join 时类型推断失败
【问题讨论】:
-
您使用的是哪个 Linq 提供程序?
-
@DoctaJonez:这真的重要吗?
-
@Steven 绝对是。如果提供者不是 Linq2Objects,很多事情都会中断。 Linq 提供程序模型目前充其量是随意的,特别是因为看到 Ayende 在 RavenDB 上花费了几个月的时间来实现它对开发人员来说是一场噩梦。
-
@Chris:也许我误解了这个问题,但请看看我的回答,告诉我这将如何影响不同的供应商。