首頁 >資料庫 >mysql教程 >為什麼 LINQ to Entities 會引發「System.String ToString()」異常,以及如何修復它?

為什麼 LINQ to Entities 會引發「System.String ToString()」異常,以及如何修復它?

Susan Sarandon
Susan Sarandon原創
2025-01-18 15:26:18325瀏覽

Why Does LINQ to Entities Throw a

LINQ to Entities:排除「System.String ToString()」錯誤

使用LINQ to Entities (LINQ2E) 查詢和操作關係資料庫中的資料時,您可能會遇到錯誤:「LINQ to Entities 無法辨識方法'System.String ToString()' 方法,而此方法無法翻譯成商店表達式。 ToString()

讓我們來看看這個場景:

<code class="language-C#">using (var context = new Context())
{
    // ...

    foreach (var item in collection)
    {
        IQueryable<entity> pages = from p in context.pages
                                   where p.Serial == item.Key.ToString()
                                   select p;
        foreach (var page in pages)
        {
            DataManager.AddPageToDocument(page, item.Value);
        }
    }

    Console.WriteLine("Done!");
    Console.Read();
}</code>
這裡,

是在 ToString() 子句中的 item.Key(字串)上呼叫的。 LINQ2E 很難將其轉換為 SQL,因為 where 缺乏直接的 SQL 對應項。 ToString()

問題的解決方案

最直接的解決方案是將字串值預先指派給變數:

<code class="language-C#">var strItem = item.Key.ToString();

IQueryable<entity> pages = from p in context.pages
                           where p.Serial == strItem
                           select p;</code>
這是有效的,因為 LINQ2E 現在將

視為常數,從而消除了翻譯的需要。 strItem

替代方案(EF Core 2.1 及更高版本):

EF Core 2.1 及更高版本提供了

輔助類,專門為 LINQ2E 表達式提供了 SqlFunctions 方法:StringConvert

<code class="language-C#">IQueryable<entity> pages = from p in context.pages
                           where p.Serial == SqlFunctions.StringConvert((double?)item.Key) // Note the cast to (double?)
                           select p;</code>
使用任一方法都可以解決「System.String ToString()」異常並確保您的 LINQ2E 查詢正確執行。 請記住適當處理潛在的空值,如

範例中的 (double?) 轉換所示。 這對於資料庫相容性通常是必需的。 SqlFunctions

以上是為什麼 LINQ to Entities 會引發「System.String ToString()」異常,以及如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn