这可以与Linq一起完成吗?

时间:2014-07-17 15:22:15

标签: c# linq

我想在我的上下文中使用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进行迭代,只为每个键创建一个对象?

5 个答案:

答案 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);
}
相关问题