[英]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();
为什么它不适用于第一次查询。 我在很多网站上都读过,在性能和安全性方面只能从数据库中检索所需的属性。 但我真的无法理解我选择的第一种方法有什么问题。 任何解释都非常感谢。
更新
是否还有其他方法可以获取所需的列并更新它们并将其存储回来?
正如其他人所说匿名类型是只读的,为了达到你想要的目的,你必须为它创建一个具有所需属性的类型:
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.