Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';在不生成过长IN子句的情况下,跨多个实体上下文查询帐户的正确方法是什么?_C#_Entity Framework - Fatal编程技术网

C# 什么';在不生成过长IN子句的情况下,跨多个实体上下文查询帐户的正确方法是什么?

C# 什么';在不生成过长IN子句的情况下,跨多个实体上下文查询帐户的正确方法是什么?,c#,entity-framework,C#,Entity Framework,我试图通过比较第二个上下文中的ID来生成要在目标上下文中创建的实体集 这是我想到的,但我正在寻找一个更好的方法或确认这是正确的方法 到目前为止,我注意到的要点是: 要求ToList()以防止查询使用时发生错误 多重语境 我知道,如果我在生成的SQL中强制一个IN子句,它可以处理的数量是有上限的,我不希望出现这种错误情况 public override IEnumerable<Campaign> Execute() { using (var eom = eomDatabase

我试图通过比较第二个上下文中的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();
        }
    }
    
    1) ToList()的作用是在该点执行查询。因此,您正在将所有ID拉入内存。根据数据集的相对大小,这可能是最优的,也可能不是最优的。如果活动比蛋糕优惠多,那么最好先使用cakeEntities上下文将蛋糕优惠id查询到内存中,然后将其处理并单独管理其余的活动

    您可以通过分批阅读蛋糕报价,轻松规避任何条款内限制-只需使用Take运算符一次处理一个固定数字:例如

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