为什么Entity Framework无法在LINQ语句中使用ToString()?

c# entity-framework linq linq-to-sql

适用于LINQ-to-SQL:

var customersTest = from c in db.Customers
                select new
                {
                    Id = c.Id,
                    Addresses = from a in db.Addresses where c.Id.ToString() == 
                        a.ReferenzId select a
                };

foreach (var item in customersTest)
{
    Console.WriteLine(item.Id);
}

但实体框架中的类似示例会收到一条错误消息 ,表示它无法“将其转换为SQL”,这是德语中的原始错误消息:

“'LINQ to Entities'erkennt die Methode'System.String ToString()'nicht,und diese Methode kann nicht in einenSpeicherausdruckübersetztwerden。”

翻译:

“'LINQ to Entities'无法识别Method'System.String ToString()',此方法无法转换为内存表达式。

任何人都可以阐明我们如何在Entity Framework中使用这种语句或解释为什么会出现这个错误?

热门答案

简单地说:LINQ to Entities不知道从ID类型到字符串的转换。

c.ID的类型是c.ID ?有什么理由说它是ID的一种类型,而ReferenzId另一种类型?如果可能,将它们设为相同的类型,此时您将不再有问题。我不知道是否还有其他方法可以在LINQ to Entities中执行转换 - 可能有 - 但是对齐类型会更清晰。

顺便说一句,这真的看起来像是一个联接:

var query = from c in db.Customers
            join a in db.Addresses on c.Id equals a.ReferenzId into addresses
            select new { Id = c.Id, Addresses = addresses };

编辑:要回复您的评论 - ToString出现在IntelliSense中,因为编译器不知道您的查询意味着什么或将如何翻译。它是完全有效的C#,并且可以生成有效的表达式树 - 只是EF不知道如何将该表达式树转换为SQL。

您可以尝试使用Convert.ToString(c.Id)而不是仅调用c.Id.ToString() ...



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因