為什麼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() ...



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因