LINQ - 尝试使用Include,自定义函数并返回自定义类型。包含不起作用

时间:2015-07-23 05:10:38

标签: c# linq objectcontext

我是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.它似乎取决于我调试的速度有多快。但是,每当我直接运行代码而不进行调试时,它总是会在列表中的第一个对象上失败。

所以,如果有人可以帮助我,我有两个问题:

  1. 如何将“评论”对象包含在“餐馆”对象中?
  2. 为什么我在调试时它在世界上是否部分工作?
  3. 提前致谢!

1 个答案:

答案 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();
}