C# 什么';在不生成过长IN子句的情况下,跨多个实体上下文查询帐户的正确方法是什么?
我试图通过比较第二个上下文中的ID来生成要在目标上下文中创建的实体集 这是我想到的,但我正在寻找一个更好的方法或确认这是正确的方法 到目前为止,我注意到的要点是:C# 什么';在不生成过长IN子句的情况下,跨多个实体上下文查询帐户的正确方法是什么?,c#,entity-framework,C#,Entity Framework,我试图通过比较第二个上下文中的ID来生成要在目标上下文中创建的实体集 这是我想到的,但我正在寻找一个更好的方法或确认这是正确的方法 到目前为止,我注意到的要点是: 要求ToList()以防止查询使用时发生错误 多重语境 我知道,如果我在生成的SQL中强制一个IN子句,它可以处理的数量是有上限的,我不希望出现这种错误情况 public override IEnumerable<Campaign> Execute() { using (var eom = eomDatabase
- 要求ToList()以防止查询使用时发生错误 多重语境
- 我知道,如果我在生成的SQL中强制一个IN子句,它可以处理的数量是有上限的,我不希望出现这种错误情况
1) ToList()的作用是在该点执行查询。因此,您正在将所有ID拉入内存。根据数据集的相对大小,这可能是最优的,也可能不是最优的。如果活动比蛋糕优惠多,那么最好先使用cakeEntities上下文将蛋糕优惠id查询到内存中,然后将其处理并单独管理其余的活动 您可以通过分批阅读蛋糕报价,轻松规避任何条款内限制-只需使用Take运算符一次处理一个固定数字:例如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(); } }
IList<int> cakeOffers; using (var cakeDb = new cakeEntities()) { cakeOffers = cakeDb.CakeOffers.Take(10).Select(c => c.pid).ToList(); }
最后在内存中使用Except()获取创建新活动所需的独家列表提供ID。我的直觉告诉我EF将生成一个难看的查询。我希望我错了。我会进行迭代。在迭代时,您使用什么进行调试,即查看它生成的查询?知道Take可以用这种方式进行批处理非常酷-我从来没有想到过。是的,您需要从db中删除报价,或者在处理完报价后将其标记为已完成。IList<int> cakeOffers; using (var cakeDb = new cakeEntities()) { cakeOffers = cakeDb.CakeOffers.Take(10).Select(c => c.pid).ToList(); }
var existingCampaignOffers = campaignDb.Campaigns .Where(co => cakeOffers.Contains(co.Offer_Id)).Select(c => c.Offer_Id).ToList();