我想在我的上下文中使用AddRange方法。对象中唯一改变的是键
foreach (var key in keysToAdd)
{
var myObject = new myObject
{
Key = key,
GroupKey = request.GroupKey,
ResourceKey = request.ResourceKey
};
//instead of iterating I want to use AddRange()
_context.MyObject.Add(myObject);
}
是否有可能不对keysToAdd进行迭代,只为每个键创建一个对象?
答案 0 :(得分:3)
var list = keysToAdd.Select(r=> new myObject
{
Key = r,
GroupKey = request.GroupKey,
ResourceKey = request.ResourceKey
}).ToList();
稍后你可以做
_context.MyObject.AddRange(list);
或者您可以在以下语句中执行此操作:
_context.MyObject.AddRange(keysToAdd.Select(r=> new myObject
{
Key = r,
GroupKey = request.GroupKey,
ResourceKey = request.ResourceKey
}));
答案 1 :(得分:1)
回答你的问题
是否有可能不对keysToAdd进行迭代,只为每个键创建一个对象?
不,不是,投影(即使用.Select(...)
的所有答案)仍然有效地迭代集合,所以必须以这种或那种方式完成。但是,使用AddRange
超过Add
会有性能差异(实际上取决于您的收藏量有多大),但如果没有适当的基准,您将不知道它是否会产生影响。
有时候LINQ可能会对性能产生不利影响,在决定重写代码之前通常值得研究。如果没有损坏,请不要修理它。
答案 2 :(得分:0)
我想你可以像这样缩短它......
keysToAdd.ToList().ForEach(key => _context.MyObject.Add(new myObject(...));
但你必须以任何方式迭代集合。
答案 3 :(得分:0)
不是100%LINQ,但List<T>
有一个ForEach
方法可以使用:
keysToAdd
.Select(k => new myObject{ Key = k, GroupKey = request.GroupKey, ResourceKey = request.ResourceKey })
.ToList()
.ForEach(x => _context.MyObject.Add(x));
或者最后一行实际上可以缩短为:
.ForEach(_context.MyObject.Add);
答案 4 :(得分:-1)
也许是这样的:
foreach (var myObject in keysToAdd.Select(key => new myObject
{
Key = key,
GroupKey = request.GroupKey,
ResourceKey = request.ResourceKey
}))
{
db.Alert.Add(myObject);
}