C# LINQ to Entities 无法识别方法“布尔”
Posted
技术标签:
【中文标题】C# LINQ to Entities 无法识别方法“布尔”【英文标题】:C# LINQ to Entities does not recognize the method 'Boolean' 【发布时间】:2013-11-16 18:43:01 【问题描述】:我在 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)' 方法,并且此方法无法转换为存储表达式。
【问题讨论】:
考虑到myValue
、from
和to
都是硬编码的,而不是您实体的一部分,这又有什么用?请举一个更现实的例子。
all of these 的可能重复项。
这些值只是硬编码的例子。这些值作为我的方法签名上的参数传递。
这真的很有趣......在写我的问题之前,我正在寻找类似的问题。现在我可能错了,但其他问题是内置调用,如 tostring() 等。我想知道像 IsBetween 这样的自定义方法是否不同,因为它是我自定义的。
LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression的可能重复
【参考方案1】:
您不能从 LINQ to Entities 查询中调用任意方法,因为查询是在 SQL 数据库引擎中执行的。您只能调用框架可以转换为等效 SQL 的方法。
如果您需要调用任意方法,则调用方法调用的查询运算符需要在前面加上 AsEnumerable()
运算符,以便调用发生在客户端。请注意,通过这样做,AsEnumerable()
左侧的所有结果都可能会被加载到内存中并进行处理。
如果您调用的方法足够短,我会简单地内联逻辑。在您的情况下,您还需要放弃Comparer
调用,而IsBetween(myValue, from, to)
将简单地变为myValue >= from && myValue <= to
。
【讨论】:
使用AsEnumerable
是我们在许多其他参考资料中找到的解决方案,当所有数据都从服务器拉到客户端时,它是一个简短但效率不高的解决方案。我想在这里看到一些使用表达式树的解决方案。
我发现在其他网站上也可以搜索。那我可能得改写我的表达了。 :(
您的方法足够短,可以内联逻辑。我会那样做。但是,您必须将比较器调用替换为等效的关系运算符(<
、>
等)。【参考方案2】:
除此之外,如果您想将值从 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());
【讨论】:
以上是关于C# LINQ to Entities 无法识别方法“布尔”的主要内容,如果未能解决你的问题,请参考以下文章
C#学习教程:LINQ to Entities无法识别方法’System.String Split(Char )’方法
LINQ to Entities 无法识别方法“Double Parse(System.String)”无法转换为存储表达式 C# asp.net [重复]
LINQ to Entities 无法识别方法 Double Round(Double, Int32, System.MidpointRounding) 方法