Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ修改和保存记录时,仅从表中获取所需的列会出现典型错误_C#_.net_Entity Framework_Linq - Fatal编程技术网

C# 使用LINQ修改和保存记录时,仅从表中获取所需的列会出现典型错误

C# 使用LINQ修改和保存记录时,仅从表中获取所需的列会出现典型错误,c#,.net,entity-framework,linq,C#,.net,Entity Framework,Linq,所以我尝试的是只从表中获取那些必须更新的列,我尝试如下: 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

所以我尝试的是只从表中获取那些必须更新的列,我尝试如下:

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;
我看到下面显示的错误

属性或索引器的匿名类型:字符串名,字符串 姓氏、字符串角色、字符串电子邮件、bool帐户\u已锁定。姓氏' 无法分配给--它是只读的

但当我从表中检索到所有值而不进行如下过滤时,效果很好

var user = (from u in context.tbl_user where u.e_Id == model.Id select u).FirstOrDefault();
为什么它不适用于第一个查询。我在许多网站上读到,从性能和安全性方面来说,只从数据库中检索所需的属性是很好的。但我真的无法理解我选择的第一种方法有什么问题。任何解释都将不胜感激


更新

是否有其他方法只获取所需列并更新它们并将它们存储回?

属性是只读的,因此您无法更改它们

停止执行或修改代码。尝试编写正确执行的代码,然后如果以后遇到性能问题,请分析应用程序并查看问题所在。如果您有一段代码由于查找最短和最长的字符串而出现性能问题,那么请开始优化此部分

我们应该忘记小效率,比如说97%的时间: 过早优化是万恶之源。然而,我们不应该通过 在这关键的3%的时间里抓住我们的机会-Donald Knuth


如果只想获取特定列,可以创建自定义类,并像其他人提到的那样在查询中填充属性。

匿名类型是只读的

为了检索可以编辑的内容,您必须创建一个类并将您的实体选择到该类中,如下所示:

或在此:

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()。不过,您可以这样做:

这将允许您仅更新对象的某些部分。

正如其他人所说的是只读的,为了实现您想要的,您必须为其创建一个类型,并具有所需的属性:

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(); 

那么,有没有其他方法可以只获取所需的列、更新它们并将其存储回去呢?您可以通过创建一个类并将数据获取到其中来实现这一点。停止微优化您的应用程序。感谢您的时间和努力……)最好是两个更改链接标题。感谢您的时间和精力:)非常感谢……)