无法翻译自定义 Linq 方法
Custom Linq method could not be translated
我创建了一个自定义扩展方法来表示 SQL 'IN' 操作,我只是想让它可重用并且更直接。
public static bool In<T>(this T source, params T[] list)
{
return list.Contains(source);
}
问题是我无法让它工作,我是这样称呼它的:
dataSource.Where(s => s.Id.In(6, 8)).Select(...);
虽然这种方法有效:
dataSource.Where(d => new int[] { 6, 8 }.Contains(d.Id)).Select(...)
我一直收到 “LINQ .Where(b => b.Id\r\n .In(__n_0))' 表达式无法翻译...”
我曾经写过这个方法,利用表达式树,
基本上,您会这样做:
dataSource.In(s => s.Id, 6, 8).Select(...);
代码:
public static IQueryable<TSource> In<TSource, TMember>(this IQueryable<TSource> source,
Expression<Func<TSource, TMember>> identifier, params TMember[] values)
{
var parameter = Expression.Parameter(typeof(TSource), "m");
var inExpression = GetExpression(parameter, identifier, values);
var theExpression = Expression.Lambda<Func<TSource, bool>>(inExpression, parameter);
return source.Where(theExpression);
}
internal static Expression GetExpression<TSource, TMember>(ParameterExpression parameter, Expression<Func<TSource, TMember>> identifier, IEnumerable<TMember> values)
{
var memberName = (identifier.Body as MemberExpression).Member.Name;
var member = Expression.Property(parameter, memberName);
var valuesConstant = Expression.Constant(values.ToList());
MethodInfo method = typeof(List<TMember>).GetMethod("Contains");
Expression call = Expression.Call(valuesConstant, method, member);
return call;
}
我创建了一个自定义扩展方法来表示 SQL 'IN' 操作,我只是想让它可重用并且更直接。
public static bool In<T>(this T source, params T[] list)
{
return list.Contains(source);
}
问题是我无法让它工作,我是这样称呼它的:
dataSource.Where(s => s.Id.In(6, 8)).Select(...);
虽然这种方法有效:
dataSource.Where(d => new int[] { 6, 8 }.Contains(d.Id)).Select(...)
我一直收到 “LINQ .Where(b => b.Id\r\n .In(__n_0))' 表达式无法翻译...”
我曾经写过这个方法,利用表达式树, 基本上,您会这样做:
dataSource.In(s => s.Id, 6, 8).Select(...);
代码:
public static IQueryable<TSource> In<TSource, TMember>(this IQueryable<TSource> source,
Expression<Func<TSource, TMember>> identifier, params TMember[] values)
{
var parameter = Expression.Parameter(typeof(TSource), "m");
var inExpression = GetExpression(parameter, identifier, values);
var theExpression = Expression.Lambda<Func<TSource, bool>>(inExpression, parameter);
return source.Where(theExpression);
}
internal static Expression GetExpression<TSource, TMember>(ParameterExpression parameter, Expression<Func<TSource, TMember>> identifier, IEnumerable<TMember> values)
{
var memberName = (identifier.Body as MemberExpression).Member.Name;
var member = Expression.Property(parameter, memberName);
var valuesConstant = Expression.Constant(values.ToList());
MethodInfo method = typeof(List<TMember>).GetMethod("Contains");
Expression call = Expression.Call(valuesConstant, method, member);
return call;
}