我是LINQ的新手,所以可能有一个简单的答案,但我有一个函数来获取指定半径内的所有位置,包括计算的距离AND(这里是不起作用的部分)使用INCLUDE函数获取相关对象。我尝试使用join和INCLUDE,因为我实际上在某处读到了他们给出不同的结果,但我无法工作。以下是我试过的:
using (MyEntities db = new MyEntities())
{
// Using custom Function udf_Haversine defined in DB
var query = (from cl in db.restaurant
join cg in db.reviews on cl.review_id equals cg.id
where (cl.longitude > lng_min && cl.longitude < lng_max)
&& (cl.latitude > lat_min && cl.latitude < lat_max)
&& (cl.active == true)
select new ObjectGeoLocationDTO
{
myObject = cl,
Distance = ModelDefinedFunctions.udf_Haversine(origLat, origLng, cl.latitude, cl.longitude)
});
return query.ToList().RemoveAll(x => x.Distance > 10);
}
和我使用INCLUDE的另一次尝试:(让我失望的是必须包含从我的自定义函数计算的距离值。如果不是系统中的那个扳手,我知道简单的INCLUDE方法将整齐地得到我的所有评论就像我餐厅对象的一部分)
using (MyEntities db = new MyEntities())
{
var query = db.restaurant
.Where(cl => cl.longitude > lng_min)
.Where(cl => cl.longitude < lng_max)
.Where(cl => cl.latitude > lat_min)
.Where(cl => cl.latitude < lat_max)
.Include(cl => cl.review)
.Select(cl => new ObjectGeoLocationDTO
{
myObject = cl,
Distance = ModelDefinedFunctions.udf_Haversine(origLat, origLng, cl.latitude, cl.longitude)
});
return query.ToList().RemoveAll(x => x.Distance > 10);
}
ObjectGeoLocationDTO定义为:
public class ObjectGeoLocationDTO
{
public Object myObject { get; set; }
public decimal Distance { get; set; }
}
(我使用了一个通用对象,因为我希望能够将它用于“餐馆”以外,还可以用于“学校”和其他表格)。因此,这些变化的工作效果很好 - 除了它们实际上并不包括相关对象(“评论”)这一事实。所以我得到了
每当我尝试通过访问评论时出现ObjectContext实例已被释放,不能再用于需要连接的操作
错误
List<ObjectGeoLocationDTO>objGeo = //call query;
((restaurant)objGeo[0].myObject).review.description
现在,这是奇怪的事情。我只是把整个解决方案都弄错了,并试图寻找另一种方法来做到这一点,但它似乎有效......有时候!就像在,当我正在调试并逐步完成这个过程时,它可以工作!这很令人困惑。所以我得到了25行,当我逐步完成它时,有时我的代码会在给出错误之前处理列表中的6个对象,因为“review”对象不可用。有时,我只能超过3.它似乎取决于我调试的速度有多快。但是,每当我直接运行代码而不进行调试时,它总是会在列表中的第一个对象上失败。
所以,如果有人可以帮助我,我有两个问题:
提前致谢!
答案 0 :(得分:0)
.ToList()应该强制查询运行
using (MyEntities db = new MyEntities())
{
return db.restaurant
.Where(cl => cl.longitude > lng_min)
.Where(cl => cl.longitude < lng_max)
.Where(cl => cl.latitude > lat_min)
.Where(cl => cl.latitude < lat_max)
.Include(cl => cl.review)
.ToList()
.Select(cl => new ObjectGeoLocationDTO {
myObject = cl,
Distance = ModelDefinedFunctions.udf_Haversine(origLat, origLng, cl.latitude, cl.longitude)
})
.Where(d=>d.Distance <= 10)
.ToList();
}