我在lambda语法中有以下linq表达式:
var myValue = 6;
var from = 2;
var to = 8;
var res = MyList.Where(m => m.person.Id == person.Id
&& IsBetween(myValue, from, to))
.Select(x => new Person { blah blah blah })
.ToList());
IsBetween是一个简单的通用助手方法,用于查看我之间是否有某些内容:
public bool IsBetween<T>(T element, T start, T end)
{
return Comparer<T>.Default.Compare(element, start) >= 0
&& Comparer<T>.Default.Compare(element, end) <= 0;
}
现在我收到了这个错误,我不知道如何解决它:
LINQ to Entities无法识别方法'Boolean IsBetween [Decimal](System.Decimal,System.Decimal,System.Decimal)'方法,并且此方法无法转换为商店表达式。
答案 0 :(得分:12)
您无法在LINQ to Entities查询中调用任意方法,因为查询是在SQL数据库引擎中执行的。您只能调用框架可以转换为等效SQL的方法。
如果需要调用任意方法,则调用方法调用的查询运算符将需要在AsEnumerable()
运算符之后,以便调用发生在客户端。请注意,通过执行此操作,AsEnumerable()
左侧的所有结果都可能会加载到内存中并进行处理。
如果您调用的方法足够短,我会简单地内联逻辑。在您的情况下,您还需要放弃Comparer
来电,而IsBetween(myValue, from, to)
只会变为myValue >= from && myValue <= to
。
答案 1 :(得分:1)
除此之外,如果要将值从MyList传递给IsBetween方法。
获取包装类(此处为Person)包含要传递给方法的相同属性。 并做这样的事情:
var res = MyList.Where(m => m.person.Id == person.Id)
.Select(x => new Person { p1 = x.p1, p2 = x.p2 })
.AsEnumerable()
.where(x => (IsBetween(x.p1, x.p2)))
.ToList());