C#LINQ to Entities无法识别方法’Boolean’

我在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 element, T start, T end) { return Comparer.Default.Compare(element, start) >= 0 && Comparer.Default.Compare(element, end) <= 0; } 

现在我收到了这个错误,我不知道如何解决它:

LINQ to Entities无法识别方法’Boolean IsBetween [Decimal](System.Decimal,System.Decimal,System.Decimal)’方法,并且此方法无法转换为商店表达式。

您无法从LINQ to Entities查询中调用任意方法,因为查询是在SQL数据库引擎中执行的。 您只能调用框架可以转换为等效SQL的方法。

如果需要调用任意方法,则调用方法调用的查询运算符将需要在AsEnumerable()运算符之后,以便调用发生在客户端。 请注意,通过执行此操作, AsEnumerable()左侧的所有结果都可能会加载到内存中并进行处理。

如果您调用的方法足够短,我只需内联逻辑。 在您的情况下,您还需要删除Comparer调用,并且IsBetween(myValue, from, to)将简单地变为myValue >= from && myValue <= to

除此之外,如果要将值从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());