繁体   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