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

时间:2013-11-16 18:43:01

标签: c# linq-to-entities

我在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)'方法,并且此方法无法转换为商店表达式。

2 个答案:

答案 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());