这可以在Linq一行中完成吗?
本文关键字:一行 Linq | 更新日期: 2023-09-27 18:13:33
我想在我的上下文中使用adrange方法。对象中唯一改变的是键
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,只是为每个键创建一个对象?
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
}));
回答你的问题
是否有可能不迭代keysToAdd,只是为每个键创建一个对象?
不,它不是,一个投影(即使用.Select(...)
的所有答案)仍然有效地迭代集合,所以这种或那种方式必须完成。但是,使用AddRange
和Add
会有性能差异(实际上取决于您的集合有多大),但是如果没有适当的基准测试,您将不知道它是否会产生差异。
我想你可以这样缩短它…
keysToAdd.ToList().ForEach(key => _context.MyObject.Add(new myObject(...));
但是你必须遍历集合
不是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);