C# 为什么LINQ表达式是;“不支持”;当把一个字符转换成字符串的时候?

C# 为什么LINQ表达式是;“不支持”;当把一个字符转换成字符串的时候?,c#,linq,entity-framework,C#,Linq,Entity Framework,如果我通过在表达式中添加空字符串将firstLetterOfLastName转换为字符串”,则在尝试将结果转换为列表时会出现以下异常: EntityFramework.SqlServer.dll中发生了类型为“System.NotSupportedException”的首次意外异常 出现问题的代码: public ActionResult Index(char firstLetterOfLastName = 'A') { var queryResult = db.Per

如果我通过在表达式中添加空字符串将
firstLetterOfLastName
转换为字符串
,则在尝试将结果转换为
列表时会出现以下异常:

EntityFramework.SqlServer.dll中发生了类型为“System.NotSupportedException”的首次意外异常

出现问题的代码:

 public ActionResult Index(char firstLetterOfLastName = 'A') {
            var queryResult = db.Persons.Where(person => person.LastName.StartsWith(firstLetterOfLastName + ""))
            .OrderBy(person => person.Id);       
            var list = queryResult.ToList(); // EXCEPTION
            return View(list);
        }
但是,当我前面在LINQ表达式之外进行转换时,如下所示:

public ActionResult Index(char firstLetterOfLastName = 'A') {
        string flofnAsString = firstLetterOfLastName + "";
        var queryResult = db.Persons.Where(person => person.LastName.StartsWith(flofnAsString + ""))
        .OrderBy(person => person.Id);
        var list = queryResult.ToList();
        return View(list);
    }

没问题。为什么会这样?

错误会告诉您确切的原因。查询提供程序不知道如何将该操作映射到SQL。当您在应用程序中执行该操作并计算其值时,它确实知道如何处理该操作的结果

异常中是否有消息?是否可以尝试使用.ToString()方法转换,而不是使用+''转换为字符串?我想知道在LINQ表达式中使用该方法时会发生什么。另外,在抛出异常时,我会检查queryResult的类型。从异常类型来看,可能是queryResult无法转换为列表。(为什么不能,可能与字符->字符串转换有关)@Vlad274
ToString
不受EF支持。@Vlad274不是不能将查询转换为列表;它根本无法构建查询,因为它使用的是EF不支持的方法,只是在对查询求值之前,表达式不会被检查并解析为SQL,这是在他调用
ToList
时。是因为
firstLetterOfLastName+”
将被翻译成
firstLetterOfLastName.ToString()+“”
而ToString不受支持?@Selman22它根本不做这样的转换。他将
+
操作符应用于
对象
字符串
。查询提供程序不知道如何将该运算符映射到SQL。该运算符的C#实现是(在一些空检查之后)调用对象上的
ToString
,然后对字符串进行concat,但是查询提供程序可以执行它想做的任何操作。@user2864740并且接受
+
类型的第一个参数的
运算符没有过载。唯一适用的重载是接受类型为
object
的参数的重载,
char
是@Servy Ahh的有效操作数。我懂了。考虑将相关的评论信息移动到响应本身(这是目前非常缺乏细节)。@ USER 826740这是一个被问及的问题的答案。这就是为什么它被贴出来作为一个答案。仅仅因为一个问题的答案对你来说很无聊并不意味着它应该出现在评论中,仅仅因为一个无关紧要的评论对你来说更有趣也不意味着它应该出现在答案中。