C# 在选择器实体框架中调用lambda

C# 在选择器实体框架中调用lambda,c#,entity-framework,lambda,C#,Entity Framework,Lambda,我需要在我的Linq2Entity查询中保留join,所以我这样做,它就可以工作了: var query = _docDedRepository.Table .GroupJoin(_actQueueRepository.Table, row => row.Act.ID, actQueue => actQueue.id_act, (left, rights) => new { left, rights = rights.DefaultIfEmpty() }) .S

我需要在我的Linq2Entity查询中保留join,所以我这样做,它就可以工作了:

var query = _docDedRepository.Table
    .GroupJoin(_actQueueRepository.Table, row => row.Act.ID, actQueue => actQueue.id_act, (left, rights) => new { left, rights = rights.DefaultIfEmpty() })
    .SelectMany(row => row.rights.Select(aq => new { row.left, Status = aq == null ? ConstValues.Statuses.STATUS_NOT_IN_QUEUE : aq.status }));
我想创建一个扩展方法,使其更简单:

public static IQueryable<TResult> LeftJoin<TOuter, TInner, TKey, TResult>(
    this IQueryable<TOuter> outer, IQueryable<TInner> inner,
    Expression<Func<TOuter, TKey>> outerKeySelector, 
    Expression<Func<TInner, TKey>> innerKeySelector,
    Func<TOuter, TInner, TResult> resultSelector)
{
    if (outer == null)
        throw new ArgumentException("outer");
    if (inner == null)
        throw new ArgumentException("inner");
    if (outerKeySelector == null)
        throw new ArgumentException("outerKeySelector");
    if (innerKeySelector == null)
        throw new ArgumentException("innerKeySelector");
    if (resultSelector == null)
        throw new ArgumentException("resultSelector");

    return outer
        .GroupJoin(inner, outerKeySelector, innerKeySelector, (left, rights) => Tuple.Create(left, rights.DefaultIfEmpty()))
        .SelectMany(x => x.Item2.Select(right => resultSelector(x.Item1, right)));
}
公共静态IQueryable LeftJoin(
这是一个易懂的外表,易懂的内心,
表达式外部选择器,
表达式innerKeySelector,
Func结果选择器)
{
如果(外部==null)
抛出新的ArgumentException(“外部”);
if(内部==null)
抛出新的ArgumentException(“内部”);
if(outerKeySelector==null)
抛出新ArgumentException(“outerKeySelector”);
如果(innerKeySelector==null)
抛出新ArgumentException(“innerKeySelector”);
if(resultSelector==null)
抛出新ArgumentException(“结果选择器”);
返回外部
.GroupJoin(内部、外部rkeyselector、内部keyselector,(左,右)=>Tuple.Create(左,右.DefaultIfEmpty())
.SelectMany(x=>x.Item2.Select(right=>resultSelector(x.Item1,right));
}

但实体框架中有一个错误,即查询不支持调用。我可以通过表达式或smth其他方式来实现这一点吗?

我想
Tuple.Create(…)
应该替换为
new{left,rights=rights.DefaultIfEmpty()}
resultSelector
应该是表达式。在这种情况下,匿名对象和Tuple之间没有什么区别。“resultSelector应该是表达式”是什么意思?如果我将resultSelector类型设置为表达式,我不能像delegateWell一样调用它,实体框架不会调用
委托
/
函数
(可能您得到了
不支持的异常
聚合异常
)并识别
Tuple.Create(…)
。我猜
Tuple.Create(…)
应替换为
new{left,rights=rights.DefaultIfEmpty()}
resultSelector
应为表达式。在这种情况下,匿名对象和元组之间没有区别。“resultSelector应该是表达式”是什么意思?如果我使用resultSelector类型的表达式,我不能像delegateWell一样调用它,实体框架不会调用
委托
/
函数
(可能您得到了
不支持的异常
聚合异常
)并识别
元组。创建(…)