我想拦截对通过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);