Linq选择而不是foreach

时间:2018-08-06 09:34:35

标签: c# linq foreach

我有两个收藏夹

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循环吗?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

是的,像这样:

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

答案 2 :(得分:0)

是的。只是

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