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 disposed
我试过制作查询和方法IEnumerable
,但结果是一样的。
我也试过设置延迟加载false。
猜猜我哪里错了?
答案 0 :(得分:0)
在您致电ToList
后,您正在执行查询,并因此将实体与上下文断开连接 - 您需要在调用{之前删除对ToList
的调用{1}}即
ForEach
此外,您无需致电userrecords.ForEach(u => ...);
,因为您的返回类型为AsEnumerable
,只需在您返回查询之前致电List<User>
,即
ToList
这不仅可以解决您的问题,而且效率更高,因为您现在只能访问数据库一次。
答案 1 :(得分: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
记录上的导航属性,您也可能会得到相同的异常,因为连接已经关闭,而且它是尝试延迟加载实体而没有连接(因此失败)。在这种情况下,您可以关闭延迟加载,或者您可以在此方法中实际调用该属性(不更改任何内容,只是为了读取它),以便在连接关闭之前加载它。
答案 2 :(得分: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次查询。处置的背景现在不应成为问题。