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

【问题讨论】:

考虑到myValuefromto 都是硬编码的,而不是您实体的一部分,这又有什么用?请举一个更现实的例子。 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 &gt;= from &amp;&amp; myValue &lt;= to

【讨论】:

使用AsEnumerable 是我们在许多其他参考资料中找到的解决方案,当所有数据都从服务器拉到客户端时,它是一个简短但效率不高的解决方案。我想在这里看到一些使用表达式树的解决方案。 我发现在其他网站上也可以搜索。那我可能得改写我的表达了。 :( 您的方法足够短,可以内联逻辑。我会那样做。但是,您必须将比较器调用替换为等效的关系运算符(&lt;&gt; 等)。【参考方案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) 方法

LINQ to Entities 无法识别该方法

LINQ to Entities 无法识别方法“布尔包含 [Int32]

LINQ to Entities 无法识别方法 IsNullOrWhiteSpace