如何使用LINQ to Entities更新现有对象的属性?

时间:2012-11-03 08:23:24

标签: c# .net entity-framework linq-to-entities garbage-collection

LINQ to Entities允许这样:

context.User.Select(u => new Person
{
    Name = u.Name,
    Parent = u.Parent.Name
});

我只需要一个大User表的两个属性,然后我使用Select方法创建一个Person对象,这样我就可以对它进行一些处理。问题是我做了很多(比如每秒两次)并且会伤害GC

所以我决定汇集Person个对象,但我不知道如何使用LINQ to Entities更新现有对象。我可以像上面那样以匿名方法获取它,然后将其属性分配给我猜测的depooled对象,然后我可以返回depooled实例,这至少会使匿名实例在较低代GC中消失但...

我真的更喜欢这样的事情:

context.User.Select(u => People.Take(u.Name, u.Parent.Name))

抛出NotSupportedException

  • 我可以使用Entity Framework更新现有对象的值吗?
  • 如果是这样,怎么样?
  • 如果没有,我有哪些替代方案?

2 个答案:

答案 0 :(得分:2)

  

我可以使用Entity Framework更新现有对象的值吗?

不 - Select方法用于投影不更新 - 您正在做的是正确的方法。或者,您可能会发现将Person 更改为 struct 会更有效,因为它会消耗更少的内存。

我认为您需要详细说明“这会伤害GC

<强>更新

Linq to Entities似乎不支持投射到struct(似乎对我有限制) - 最好的方法就是投射到匿名类型&amp;然后,您可以使用汇集机制将结果映射到Person类,例如

var users = (from u in context.User
            select new {
                Name = u.Name,
                Parent = u.Parent.Name
            }).ToList().Select(u => People.Take(u.Name, u.Parent));

答案 1 :(得分:1)

您不能从DB中仅提取对象的少数属性。如果要更新它,则必须获取完整对象,更新它然后保存更改。

但是如果你真的需要更新几个字段并且不想移动完整对象,你可以使用ExecuteStoredCommand对象的context方法(MySQL示例):

    context.ExecuteStoredCommand("UPDATE table1 SET field1 = @value1 WHERE field2 = @value2", new MySqlParameter("@value1", 1), new MySqlParameter("@value2", 2))

它要求您编写一些SQL代码,但节省您的时间,因为您不需要担心打开连接,创建命令和其他东西,这是用户常规连接器所必需的