簡體   English   中英

使用LINQ僅從表中獲取所需的列以修改和保存記錄會產生典型錯誤

[英]Fetching only required columns from table using LINQ to modify and save record gives a typical error

所以我嘗試的只是從表中獲取那些必須更新的列,我嘗試如下:

var user = (from u in context.tbl_user where u.e_Id == model.Id select 
           new { u.first_name, u.last_name, u.role, u.email, u.account_locked })
           .FirstOrDefault();

但是,當我嘗試為獲取的數據分配新值時,如下所示

user.first_name = model.FirstName;

我看到下面的錯誤顯示

錯誤圖片

屬性或索引器'匿名類型:string first_name,string last_name,string role,string email,bool account_locked.first_name'無法分配 - 它是只讀的

但是,當我從表中檢索所有值而沒有過濾如下時,它工作得很好。

var user = (from u in context.tbl_user where u.e_Id == model.Id select u).FirstOrDefault();

為什么它不適用於第一次查詢。 我在很多網站上都讀過,在性能和安全性方面只能從數據庫中檢索所需的屬性。 但我真的無法理解我選擇的第一種方法有什么問題。 任何解釋都非常感謝。


更新

是否還有其他方法可以獲取所需的列並更新它們並將其存儲回來?

匿名類型屬性是只讀的,因此您無法更改它們。

停止對代碼進行微優化過早優化 嘗試編寫正確執行的代碼,然后如果您以后遇到性能問題,請分析您的應用程序並查看問題所在。 如果由於找到最短和最長的字符串而有一段代碼存在性能問題,那么就開始優化這部分。

我們應該忘記小的效率,大約97%的時間說:過早的優化是所有邪惡的根源。 然而,我們不應該放棄那個關鍵的3%的機會 - 唐納德克努特

如果您只想獲取特定列,則可以創建自定義類並在查詢中填充屬性,就像其他人提到的那樣。

正如其他人所說匿名類型是只讀的,為了達到你想要的目的,你必須為它創建一個具有所需屬性的類型:

public class User
   {
       public string FirstName {get;set;}
       public string LastName {get;set;}
       .....................
       .....................
   }

然后,你必須在你的linq查詢中使用它:

var user = (from u in context.tbl_user 
            where u.e_Id == model.Id
            select new User 
                  { 
                     FirstName = u.first_name,
                     LastName =  u.last_name,
                     ......................,
                     ..................... 
                   }).FirstOrDefault(); 

匿名類型是設計的只讀類型。

為了檢索您可以編輯的內容,您必須創建一個類並在該類中選擇您的實體,如下所示: 如何使用LINQ選擇對象?

或者在這里:

var user = (from u in context.tbl_user where u.e_Id == model.Id select 
           new User_Mini { u.first_name, u.last_name, u.role, u.email, u.account_locked })
           .FirstOrDefault();

注意:編輯此新對象時,您將無法調用context.SubmitChnages()。 你可以這樣做: LINQ to SQL:如何在不檢索整個實體的情況下更新唯一的字段

這將允許您僅更新對象的某些部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM