【问题标题】:Linq select instead of foreachLinq 选择而不是 foreach
【发布时间】:2018-08-06 09:34:34
【问题描述】:

我有两个收藏

var campaigns = new List<Campaigns>();
IEnumerable<CampaignsDb> campaignsFromDB = db.Campaigns
        .Where(c => (c.IsDeleted == false))
        .OrderBy(c => c.ScheduleTime)
        .ToArray();

接下来我将使用foreach() 填充另一个集合:

foreach (var campaign in campaignsFromDB)
{
    campaigns.Add(new Campaigns { CampaignID = campaign.CampaignID, OwnerID = campaign.CreatedBy, AccountID = campaign.AccountID });
}

我可以使用Select() linq 方法代替foreach 循环吗?

【问题讨论】:

标签: c# linq foreach


【解决方案1】:

除非您需要以原始空列表开头(例如,首先添加一些其他广告系列),否则您可以使用:

var campaigns = campaignsFromDB
    .Select(c => new Campaigns
           {
               CampaignID = c.CampaignID,
               OwnerID = c.CreatedBy,
               AccountID = c.AccountID
           })
    .ToList();

但是,为了填充campaignsFromDB,它仍会从数据库中获取完整的活动信息。如果您出于其他原因需要该数组,那很好,但如果不需要,您可以通过将投影放入查询中来提高效率:

var campaigns = db.Campaigns
    .Where(c => !c.IsDeleted)
    .OrderBy(c => c.ScheduleTime)
    .Select(c => new Campaigns
           {
               CampaignID = c.CampaignID,
               OwnerID = c.CreatedBy,
               AccountID = c.AccountID
           })
    .ToList();

【讨论】:

  • @Dr.Snail:第一个sn-p使用campaignsFromDB,已经过滤了。第二个sn-p使用db.Campaigns,包括过滤和排序。
【解决方案2】:

是的。只是

var campaigns = db.Campaigns
        .Where(c => (c.IsDeleted == false))
        .OrderBy(c => c.ScheduleTime)
        .Select(c => new Campaigns { CampaignID = c.CampaignID, OwnerID = c.CreatedBy, AccountID = c.AccountID })
        .ToList();

或者如果您也需要数据库中的源集

var campaignsFromDB = db.Campaigns
        .Where(c => (c.IsDeleted == false))
        .OrderBy(c => c.ScheduleTime)
        .ToArray();

var campaigns = campaignsFromDB
        .Select(c => new Campaigns { CampaignID = c.CampaignID, OwnerID = c.CreatedBy, AccountID = c.AccountID })
        .ToList();

【讨论】:

  • 感谢您的贡献,但它增加了哪些现有答案尚未涵盖的内容?
【解决方案3】:

是的,像这样:

var campaigns = db.Campaigns
    .Where(c => !c.IsDeleted)
    .OrderBy(c => c.ScheduleTime)
    .Select(c => new Campaigns
    {
        CampaignID = c.CampaignID,
        OwnerID = c.CreatedBy, 
        AccountID = c.AccountID
    })
    .ToList();

【讨论】:

  • 请注意,如果 OP 出于其他原因需要 campaignsFromDB,这将对数据库进行不必要的查询。可能值得一提的是,至少
  • 好吧,我们甚至不知道这是使用 EF,所以我不打算添加它。当然可能是这样,但是根据我们掌握的信息...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 2012-02-07
相关资源
最近更新 更多