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
。
答案 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代码,但节省您的时间,因为您不需要担心打开连接,创建命令和其他东西,这是用户常规连接器所必需的