3

LINQ to Entities 允许这样做:

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

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

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

我真的更喜欢这样的东西:

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

抛出一个NotSupportedException.

  • 我可以使用实体框架来更新现有对象的值吗?
  • 如果是这样,怎么做?
  • 如果没有,我有什么选择?
4

2 回答 2

2

我可以使用实体框架来更新现有对象的值吗?

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

我认为您需要详细说明“它伤害了GC

更新

看来 Linq to Entities 不支持投影到struct's (对我来说似乎是一个限制) - 最好的方法是只投影到匿名类型然后你可以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));
于 2012-11-03T09:03:38.963 回答
1

您不能只从数据库中提取对象的少数属性。如果你想更新它,你必须得到完整的对象,更新它,然后保存更改。

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

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

它需要您编写一些SQL代码,但可以节省您的时间,因为您无需担心打开连接,创建命令和其他使用常规连接器所需的事情

于 2012-11-03T08:43:23.243 回答