Несколько контекстных запросов внутри запроса - PullRequest
0 голосов
/ 08 января 2019

Итак, у меня проблема с запросом конкретных данных из моей базы данных. Допустим, у меня есть два контекста, содержащие объекты типа:

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

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

Каждый трек имеет определенное количество назначенных трекпоинтов. Я хочу запросить все трекпоинты, чьи треки пересекаются с другим треком (области построены из минимальных, максимальные значения перекрываются).

Я пытаюсь достичь этого только в одном запросе, так как производительность важна. Мне удалось сделать это с помощью запроса ниже, но время выполнения не так хорошо. Я уверен, что есть лучшие способы для этого. Буду признателен за любой совет.

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 голосов
/ 08 января 2019

Вы должны смоделировать ваши отношения в ваших сущностях. Тогда вам будет проще создать лямбда-запрос или запрос linq, который приведет к правильному запросу, выполняемому на стороне БД-сервера.

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.

...