查询中的多个上下文查询

时间:2019-01-08 17:42:34

标签: c# entity-framework linq entity-framework-6

因此,从数据库查询特定数据时出现问题。可以说我有两个包含类型为对象的上下文:

TrackPoint {
    int Id;
    double Latitude;
    double Longitude;
    int TrackId
{

Track {
    int Id;
    double MinLatitude;
    double MaxLatitude;
    double MinLongitude;
    double MaxLongitude;
}

每个轨道都分配了一定数量的TrackPoints。我想查询所有轨迹与其他轨迹相交的轨迹点(由最小值,最大值构成的区域重叠)。

由于性能很重要,因此我只想在一个查询中实现这一目标。我已经设法通过下面的查询来做到这一点,但是执行时间不是很好。我肯定有更好的方法。我将不胜感激。

var similarTrackPoints = Context.TrackPoints.Include("Track").Where(
    tp => 
    Context.Tracks.Where(t => t.Id == tp.TrackId).FirstOrDefault().MinLongitude <= track.MaxLongitude &&
    Context.Tracks.Where(t => t.Id == tp.TrackId).FirstOrDefault().MaxLongitude >= track.MinLongitude &&
    Context.Tracks.Where(t => t.Id == tp.TrackId).FirstOrDefault().MinLatitude <= track.MaxLatitude &&
    Context.Tracks.Where(t => t.Id == tp.TrackId).FirstOrDefault().MaxLatitude >= track.MinLatitude)
.ToList();

1 个答案:

答案 0 :(得分:1)

您应该在实体中为您的关系建模。然后,您可以更轻松地构造一个lambda或linq查询,从而生成在DB Server端执行的正确查询。

public class TrackPoint 
{
    public int Id { get; set; }
    public double Latitude { get; set; }
    public double Longitude { get; set; }
    public double TrackId { get; set; }
    public Track Track { get; set; }
}

public class Track 
{
    public double Id { get; set; }
    public double MinLatitude { get; set; }
    public double MaxLatitude { get; set; }
    public double MinLongitude { get; set; }
    public double MaxLongitude { get; set; }
    public ICollection<TrackPoint> TrackPoints { get; set; }
}
Context.TrackPoints.Include("Track")
    .Where(_ => 
        _.Track.MinLongitude <= track.MaxLongitude &&
        _.Track.MaxLongitude >= track.MinLongitude &&
        _.Track.MinLatitude  <= track.MaxLatitude &&
        _.Track.MaxLatitude  >= track.MinLatitude)
    .ToList();

我在上面的代码中没有包含关系映射,但是您可以使用类似于其他EF映射的流利或属性符号来映射关系。