0

我试图通过比较来自第二个上下文的 ID 来生成要在目标上下文中创建的实体集。

这是我想出的,但我正在寻找更好的方法或确认这是正确的方法。

到目前为止,我注意到的要点是:

  • ToList() 用于防止查询使用多个上下文时发生错误
  • 我知道,如果我在生成的 SQL 中强制使用 IN 子句,那么它可以处理的数量是有上限的,我不希望出现这种错误情况。

    public override IEnumerable<Campaign> Execute()
    {
        using (var eom = eomDatabase.Create())
        using (var cake = cakeEntities.Create())
        {
            var campaigns = eom.Campaigns.Select(c => c.pid).ToList();
            var offers = cake.CakeOffers.Select(c => c.Offer_Id).ToList();
            var newOffers = offers.Except(campaigns).ToList();
            var newCampaigns = from offer in cake.CakeOffers
                               where newOffers.Contains(offer.Offer_Id)
                               select new Campaign {
                                   pid = offer.Offer_Id,
                                   campaign_name = offer.OfferName
                               };
    
            return newCampaigns.ToList();
        }
    }
    

更新:显然 let 语句不像我想的那样工作 - 上面没有产生错误,而我的原始代码会导致多上下文错误。

    var newCampaigns = from offer in cake.CakeOffers 
                       let campaigns = eom.Campaigns.Select(c => c.pid).ToList() 
                       let offers = cake.CakeOffers.Select(c => c.Offer_Id).ToList() 
                       let newOffers = offers.Except(campaigns).ToList() 
                       where newOffers.Contains(offer.Offer_Id) 
                       select new Campaign { 
                           pid = offer.Offer_Id, 
                           campaign_name = offer.OfferName 
                       }; 
4

1 回答 1

1

1) ToList() 的影响是在该点执行查询。因此,您将所有 Id 拉入内存。根据数据集的相对大小,这可能是最优的,也可能不是最优的。如果活动多于蛋糕优惠,您最好先使用 cakeEntities 上下文将蛋糕优惠 id 查询到内存中 - 然后处理它并单独管理其余部分。

您可以通过批量读取蛋糕报价轻松规避任何 IN 子句限制 - 只需使用 Take 运算符一次处理一个固定数字:例如

IList<int> cakeOffers;

using (var cakeDb = new cakeEntities())
{
    cakeOffers = cakeDb.CakeOffers.Take(10).Select(c => c.pid).ToList();        
}

2)(编辑 - 我想你知道这一点......)你实际上并没有在上下文中创建任何新的广告系列。你只是在内存中构建了一堆。您需要将它们添加到上下文中,然后将其保存以创建它们。

编辑

然后,我将使用 Contains 子句在 eomDatabase 中查询具有匹配 offer_Ids 的现有活动:例如:

var existingCampaignOffers = campaignDb.Campaigns
    .Where(co => cakeOffers.Contains(co.Offer_Id)).Select(c => c.Offer_Id).ToList();

然后最后在内存中使用 except() 来获取创建新广告系列所需的独占列表 Offer_Ids。

于 2012-05-14T19:55:04.890 回答