这可以在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,只是为每个键创建一个对象?

这可以在Linq一行中完成吗?

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(...)的所有答案)仍然有效地迭代集合,所以这种或那种方式必须完成。但是,使用AddRangeAdd会有性能差异(实际上取决于您的集合有多大),但是如果没有适当的基准测试,您将不知道它是否会产生差异。

有时候LINQ会损害性能,在决定重写代码之前,通常值得研究一下。没坏就别修。

我想你可以这样缩短它…

 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);