Express Trees:重写查询谓词以使用连接

时间:2018-04-17 04:35:09

标签: c# linq expression-trees

我想拦截对通过Entity Framework发送的数据库的查询,并从

等转换
SELECT * FROM EntityA where (EntityA.Title Like "foo" 
OR EntityA.Description Like "foo") and EntityA.Prop1 in (1,2,3)

SELECT * FROM EntityA INNER JOIN EntityB on EntityA.ID = EntityB.ID 
WHERE (EntityB.Title Like "foo" or EntityB.Description Like "foo") and 
EntityA.Prop1 in (1,2,3)

我正在使用ExpressionTrees传递谓词并使用ExpressionVisitor我可以

override Expression VisitBinary(BinaryExpression b) 

访问Or节点。

我有一个有效的实现,我发出两个单独的db调用,一个用于获取满足条件标题搜索条件的EntityA的id。 另一个将该表达式与EntityA上的其他谓词定位属性相结合。

我更愿意只使用重写的查询发出一个调用,该查询利用JOIN,但不清楚如何重写Or以创建到实体类型的连接不是原始表达的一部分。

更新:原始帖子中的错别字 - 其表达式的错误类型供后续使用。

// This doesn't work as it creates an Expression of the wrong type
Expression<Func<IEnumerable<EntityA>, IEnumerable<EntityB>, IEnumerable<EntityA>>> expa = 
(mvs, fts) => mvs.Join(fts, mv=> mv.ID, f => f.ID, (mv1, fts1) => new { FTS=fts1, MV=mv1})
.Where(fts1 => fts1.FTS.Title.Contains("foo") && fts1.FTS.Description.Contains("foo")).Select(a => a.MV); 

0 个答案:

没有答案