因此,从数据库查询特定数据时出现问题。可以说我有两个包含类型为对象的上下文:
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();
答案 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映射的流利或属性符号来映射关系。