Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不能转换为表达式树?_C#_.net_Linq - Fatal编程技术网

C# 为什么不能转换为表达式树?

C# 为什么不能转换为表达式树?,c#,.net,linq,C#,.net,Linq,我尝试为linq函数构建一个匿名函数。我不明白为什么不能这样做: found = db.Label.Any(lb => { var shortNames = lb.lbShortName.Split('/').ToList(); bool foundShortName = false; foreach (var shortName in shortNames) { if (String.Compare(shortName, name, St

我尝试为linq函数构建一个匿名函数。我不明白为什么不能这样做:

found = db.Label.Any(lb => {
    var shortNames = lb.lbShortName.Split('/').ToList();

    bool foundShortName = false;
    foreach (var shortName in shortNames)
    {
        if (String.Compare(shortName, name, StringComparison.OrdinalIgnoreCase) == 0)
        {
            foundShortName = true;
            break;
        }
    }
    return foundShortName;
或者更好,我不明白的是为什么是
表达式(Func(,)
而不是
Func(,)

});

必须使用Linq提供程序,如Linq to SQL或实体框架。它试图将表达式转换为类似SQL查询的内容,但这还不够简单。如果
db.Label
是一个普通的
IEnumerable
而不是
IQueryable

这是一个相当复杂的函数,那么这就行了!linq在简单的事情上做得很好。也许您可以使用projections.EF需要表达式将其分解为单独的步骤,以便它可以将Linq代码转换为SQL。另外,如果我正确阅读了您的代码,您可以只执行一个
Contains
调用。@DanielA.White,但
StringComparison.OrdinalIgnoreCase
部分除外…@DStanley备用项将是的索引。当集合可IQueryable时,我是否可以使用函数而不是表达式?否。查询引擎检查代码表达式(您实际上不是在传递一个
Func
,而是传递一个
表达式
),它不知道函数的实际功能。您必须使用一个可以转换为SQL的表达式,或者如果希望.NET运行代码,请先运行查询(
.ToList()
)然后执行更改,尽管在这种情况下这不符合您的需要。