设想以下表结构LINQ多个连接的IQueryable修改结果选择表达
---------
TableA
ID
Name
---------
TableB
ID
TableAID
---------
TableC
ID
TableBID
我希望定义连接这三个表和接受一个Expression<Func<TableA, TableB, TableC, T>>
作为选择器的功能。
所以我想类似如下:
public IQueryable<T> GetJoinedView<T>(Expression<Func<TableA, TableB, TableC, T>> selector)
{
return from a in DbContext.Set<TableA>()
join b on DbContext.Set<TableB>() a.ID equals b.TableAID
join c on DbContext.Set<TableC>() b.ID equals c.TableBID
select selector;
}
现在,很明显上面并没有做什么,我想要它做的,这会给我表达类型的IQueryable
。我可以使用方法链接语法,但最终我需要多个选择器,每个方法链调用一个。有没有办法采取的选择,并把它应用到一个匿名类型如以下不完整的功能:
public IQueryable<T> GetJoinedView<T>(Expression<Func<TableA, TableB, TableC, T>> selector)
{
var query = from a in DbContext.Set<TableA>()
join b on DbContext.Set<TableB>() a.ID equals b.TableAID
join c on DbContext.Set<TableC>() b.ID equals c.TableBID
select new
{
A = a, B = b, C = c
};
// I need the input selector to be modified to be able to operate on
// the above anonymous type
var resultSelector = ModifyInputSelectorToOperatorOnAnonymousType(selector);
return query.Select(resultSelector);
}
如何可以这样做的任何想法?
该方法将从几个不同的地方被调用,并且需要能够在数据库上执行选择。我不认为提供的解决方案将在数据库上运行,实际上可能会得到一个TargetInvocationException – mhand
我纠正了,EF确实允许在IQueryable表达式树中使用未映射的类型。 – mhand
是的,只要生成的表达式树可以转换为SQL,那就很好。 – Ocelot20