C# 在选择器实体框架中调用lambda
我需要在我的Linq2Entity查询中保留join,所以我这样做,它就可以工作了: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
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一样调用它,实体框架不会调用委托
/函数
(可能您得到了不支持的异常
或聚合异常
)并识别元组。创建(…)
。