Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# EF和Linq除外_C#_Linq_Entity Framework - Fatal编程技术网

C# EF和Linq除外

C# EF和Linq除外,c#,linq,entity-framework,C#,Linq,Entity Framework,鉴于这两个EF模型,我将如何使用linq从InteractionSegmentDetail中选择自定义_SegmentsParsed中不存在的所有记录?使用InteractionIDKey字段作为比较器 public partial class Custom_SegmentsParsed { public string InteractionIDKey { get; set; } public string SegmentNum { get; set;

鉴于这两个EF模型,我将如何使用linq从InteractionSegmentDetail中选择自定义_SegmentsParsed中不存在的所有记录?使用InteractionIDKey字段作为比较器

 public partial class Custom_SegmentsParsed
    {
        public string InteractionIDKey { get; set; }
        public string SegmentNum { get; set; }
        public System.DateTime ServerTs { get; set; }
        public System.DateTime CUTC { get; set; }
        public Nullable<int> Duration { get; set; }
        public string LocalParty { get; set; }
        public string Queue { get; set; }
        public string EndCode { get; set; }
        public string Details { get; set; }
}
  public partial class InteractionSegmentDetail
    {
        public string InteractionIDKey { get; set; }
        public short SiteID { get; set; }
        public byte SeqNo { get; set; }
        public System.DateTime StartDateTimeUTC { get; set; }
        public int StartDTOffset { get; set; }
        public string ConversationID { get; set; }
        public string SegmentLog { get; set; }
}
我会用Where和Any


我会在这里使用三个查询来组合它们,在这种情况下会破坏性能

List<string> customKeys = dbContext.Custom_SegmentsParseds.Select(s => s.InteractionIDKey).ToList();
List<string> interactionKeys = dbContext.InteractionSegmentDetails.Select(s => s.InteractionIDKey).ToList();
IEnumerable<string> overLap = interactionKeys.Except(customKeys);
List<InteractionSegmentDetail> detailList = dbContext.InteractionSegmentDetails.Where(seg => overLap.Contains(seg.InteractionIDKey)).ToList();

下面是一个使用查询语法执行左连接的选项,该选项将非常有效:

var results = 
    (from isd in db.InteractionSegmentDetails
     join csp in db.Custom_SegmentsParsed on isd.InteractionIDKey equals csp.InteractionIDKey into possibleCSPs
     from csp in possibleCSPs.DefaultIfEmpty()
     where csp.InteractionIDKey == null //ensure no CSP match was found
     select isd).Distinct().ToArray(); //don't include duplicates (just in case)

这样做将需要dbContext在每次迭代中获取表中的每个InteractionIDKey。@TravisJ不,不会。查询提供程序将能够识别您正在查询本身内部使用来自同一提供程序的另一个查询。如果Where正在迭代一个IEnumerable,那么是的,就是这样,但不是。@TravisJ如果它是一个可枚举的,当然,但不是,它是一个查询提供程序。它不会将此代码作为C代码执行,而是将整个查询转换为SQL代码,从而生成一个SQL查询,其中一个内部查询在一个外部查询中执行,但仍然是一个SQL查询。当然,如果查询来自不同的提供者,那么它将无法做到这一点,并且代码将中断。它不会低效,而且会执行N+1查询,正如您所建议的,它只会抛出一个异常。@TravisJ,因为没有迭代。没有迭代任何内容。整个事情;显示的整个代码块将创建一个表达式对象,然后查询提供程序将能够将其作为一个大的块进行检查,并尝试将其转换为SQL。它将成功,然后数据库将花费大量时间将SQL优化为合理的算法并执行查询。为什么它会迭代任何东西,如果迭代了,为什么每次都要重新构建数据集?@TravisJ为什么不呢?你认为所有的数据库都是由一年级的程序员编写的吗?它们被优化到不能完全按照您所说的去做,部分原因是太多SQL是由不知道如何编写高效查询的人编写的。数据库有责任尽可能地优化这些查询,我认为没有理由相信它不能在这里执行简单而直接的缓存机制。如果您有理由相信它不会,除了,数据库不可能尝试并优化它,那么我希望看到它。这看起来是可行的,直到它抛出内存不足异常。看来我需要重新考虑一下。内存不足异常?这些表中有多少条记录?@Wjdavis5-如果重叠被更改为字符串[]重叠=interactionKeys.ExceptcustomKeys.ToArray;?此查询不必要地将这两个数据库表中的整个ID集拉入内存,在内存中执行set操作,而不是让数据库执行,然后需要另一个非常昂贵的操作才能实际获得结果。这里发布的所有其他解决方案都会表现得更好。@TravisJ不,他们没有。您的是唯一一个这样做的,因为您在执行操作之前显式地将查询转换为列表。如果你不这么做,那就不会发生。现在,您可以通过删除ToList调用而不将查询强制转换为IEnumerable来解决这个问题;如果您停止主动阻止查询提供程序在单个查询中执行所有这些操作,那么它将能够完全做到这一点。这非常有效!对InteractionSegmentDetail表中的750万条记录和Custom_SegmentParsed表中的0条记录执行3.125秒。但我很好奇,随着Custom_SegmentParsed表的增长,性能会随着时间的推移而下降。
List<string> customKeys = dbContext.Custom_SegmentsParseds.Select(s => s.InteractionIDKey).ToList();
List<string> interactionKeys = dbContext.InteractionSegmentDetails.Select(s => s.InteractionIDKey).ToList();
IEnumerable<string> overLap = interactionKeys.Except(customKeys);
List<InteractionSegmentDetail> detailList = dbContext.InteractionSegmentDetails.Where(seg => overLap.Contains(seg.InteractionIDKey)).ToList();
var results = 
    (from isd in db.InteractionSegmentDetails
     join csp in db.Custom_SegmentsParsed on isd.InteractionIDKey equals csp.InteractionIDKey into possibleCSPs
     from csp in possibleCSPs.DefaultIfEmpty()
     where csp.InteractionIDKey == null //ensure no CSP match was found
     select isd).Distinct().ToArray(); //don't include duplicates (just in case)