0
public List<User> Getdata()
{
     using (var context =new  huntableEntities())
     {             
         IQueryable<User> userrecords = (context.Users.Where(x => x.RecuiteReferalId == 24));
         userrecords.ToList().ForEach(u =>
                                         {

                                          u.CurrentCompany =
                                                 u.EmploymentHistories.Where(
                                                         e => e.IsCurrent && e.MasterCompany != null).Select(
                                                             e => e.MasterCompany.Description).FirstOrDefault();
                                                 u.CurrentPosition =
                                                     u.EmploymentHistories.Where(
                                                         e => e.IsCurrent && !string.IsNullOrEmpty(e.JobTitle)).
                                                         Select(e => e.JobTitle).FirstOrDefault();
                                         });
        return userrecords.AsEnumerable().ToList();
     }          
}

我收到了object context disposedat return 声明

我尝试通过查询和方法IEnumerable,但结果是一样的。我还尝试将延迟加载设置为 false。

猜猜我哪里出错了?

4

3 回答 3

0

调用后,ToList您正在执行查询,因此将实体与上下文断开连接 - 您需要在调用ieToList 之前删除调用ForEach

userrecords.ForEach(u => ...);

AsEnumerable此外,您的返回类型无需调用List<User>,只需ToList在返回查询之前调用,即

return userrecords.ToList();

这不仅可以解决您的问题,而且由于您现在只访问数据库一次,因此效率更高。

于 2013-01-09T13:43:52.383 回答
0

不确定为什么在您return列出列表时会处理上下文,但是您的代码中有一个偷偷摸摸的扭曲,无论如何都会产生意想不到的结果。您的ForEach声明不会改变任何事情!userrecords是一个IQueryable,你唯一要做的就是枚举它两次:在语句中ForEach和在ToList()语句return中。

您可以通过在开始时创建一个列表来防止这种情况:

List<User> userrecords = context.Users
                        .Include("EmploymentHistories.MasterCompany")
                        .Where(x => x.RecuiteReferalId == 24)
                        .ToList();
userrecords.ForEach(u => ...

Include是为了防止n + 1个查询。已处置的上下文现在不应该成为问题。

于 2013-01-09T14:55:17.613 回答
0

而不是使用扩展方法,您应该只使用常规的 Foreach 循环来获得 @James 所说的好处。另外,您还可以清理 LINQ 查询:

foreach (var u in userrecords)
{
  u.CurrentCompany = u.EmploymentHistories
                      .FirstOrDefault(e => e.IsCurrent && e.MasterCompany != null)
                      .MasterCompany.Description;

  u.CurrentPosition = u.EmploymentHistories
                       .FirstOrDefault(e => e.IsCurrent && string.IsNullOrEmpty(e.JobTitle))
                       .JobTitle;
}

并让它返回userrecords.ToList()

不过,还有一点需要注意:如果您在任何时候尝试使用User记录上的导航属性,您也可能会遇到相同的异常,因为连接已经关闭,并且它正在尝试延迟加载实体而没有连接(因此失败)。在这种情况下,您可以关闭延迟加载,或者您可以在此方法中实际调用该属性(不更改任何内容,只是为了读取它)以在连接关闭之前加载它。

于 2013-01-09T14:44:58.573 回答