C# 如何在下一个方法中获得IQueryable作为参数?
我将努力使我的代码更好,但我不知道如何使iQuery能够运行到下一个函数 错误: 中发生“System.InvalidOperationException”类型的异常 EntityFramework.dll,但未在用户代码中处理 其他信息:操作无法完成,因为 DbContext已被释放 这是一个问题:C# 如何在下一个方法中获得IQueryable作为参数?,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我将努力使我的代码更好,但我不知道如何使iQuery能够运行到下一个函数 错误: 中发生“System.InvalidOperationException”类型的异常 EntityFramework.dll,但未在用户代码中处理 其他信息:操作无法完成,因为 DbContext已被释放 这是一个问题: public List<GitUser> FavoritesUsersListFromHistory(IQueryable users) { List<G
public List<GitUser> FavoritesUsersListFromHistory(IQueryable users)
{
List<GitUser> favoritesList = new List<GitUser>();
using (var db = new GitContext())
{
foreach (CookiesHistory result in users) <-- users make this error
{
var user = (from u in db.GitUsers
where u.Id == result.GitUserId
select new { u }).First();
favoritesList.Add(user.u);
}
}
return favoritesList;
public List favorites用户列表fromHistory(IQueryable用户)
{
列表收藏夹列表=新列表();
使用(var db=new GitContext())
{
foreach(CookiesHistory result in users)首先,错误是由于创建作为参数传递的查询时使用的上下文在您尝试迭代结果时已被释放。因此,我的第一个建议是将上下文变量创建为全局变量:
public class FavoriteController
{
protected GitContext db;
public FavoriteController()
{
db=new GitContext();
}
public IEnumerable<GitUser> FavoritesUsers(int cookieId, int count)
{
return FavoritesUsersListFromHistory(TopFavoritesUsers(cookieId, count));
}
//create a class (CookiesHistoryDTO) to save the result of this query
public IQueryable<CookiesHistoryDTO> TopFavoritesUsers(int cookieId, int count)
{
IQueryable<CookiesHistoryDTO> results = (from ch in db.CookiesHistory
where ch.GitUserId != null
where ch.MyCookieId == cookieId
group ch by new { ch.GitUserId, ch.MyCookieId, ch.SearchGitUser } into g
orderby g.Count() descending
select new CookiesHistoryDTO{ GitUserId = g.Key.GitUserId, MyCookieId = g.Key.MyCookieId, SearchGitUser = g.Key.SearchGitUser, Count = g.Count() }
).Take(count);
return results;
}
public IEnumerable<GitUser> FavoritesUsersListFromHistory(IQueryable<CookiesHistoryDTO> user)
{
//Here the context you use to create your first query is still alive
var userIds=user.Select(e=>e.GitUserId).Contains(e.Id);
return db.GitUsers.Where(e=>userIds.Contains(e.Id)).ToList();// Here is when both query are going to be executed.
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}
公共类FavoriteController
{
受保护的GitContext数据库;
公共收藏夹控制器()
{
db=新的GitContext();
}
公共IEnumerable收藏夹用户(int-cookieId,int-count)
{
从历史记录中返回FavoritesUsersListFromHistory(TopFavoritesUsers(cookieId,count));
}
//创建一个类(CookiesHistoryDTO)以保存此查询的结果
公共IQueryable TopFavoritesUsers(整数cookieId,整数计数)
{
IQueryable结果=(来自db.CookiesHistory中的ch
其中ch.GitUserId!=null
其中ch.MyCookieId==cookieId
按新的{ch.GitUserId,ch.mycokieid,ch.SearchGitUser}将ch分组到g中
orderby g.Count()降序
选择new CookiesHistoryDTO{GitUserId=g.Key.GitUserId,MyCokieId=g.Key.MyCokieId,SearchGitUser=g.Key.SearchGitUser,Count=g.Count()}
).记(数);
返回结果;
}
公共IEnumerable FavoritesUsersListFromHistory(IQueryable用户)
{
//在这里,用于创建第一个查询的上下文仍然有效
var userIds=user.Select(e=>e.GitUserId).Contains(e.Id);
返回db.GitUsers.Where(e=>userIds.Contains(e.Id)).ToList();//这是执行两个查询的时间。
}
受保护的覆盖无效处置(布尔处置)
{
如果(处置)
{
db.Dispose();
}
基地。处置(处置);
}
}
您无法从用户处获得IQueryable
!
public FavoritesController(IGitUserRepository repo, CookieHelper _cookieHelper)
{
//myCookieRepository = cookieRepo;IMyCookieRepository cookieRepo,
repository = repo;
cookieHelper = _cookieHelper;
}
// GET: Favorites
public PartialViewResult FavoritesRepos()
{
IEnumerable<GitUser> favorites = FavoritesUsers(cookieHelper.GetHttpCookieId(), countOfFavoritesUsers);
return PartialView("_FavoritesRepos", favorites);
}
public IEnumerable<GitUser> FavoritesUsers(int cookieId, int count)
{
return FavoritesUsersListFromHistory(TopFavoritesUsers(cookieId, count));
}
public IQueryable TopFavoritesUsers(int cookieId, int count)
{
using (var db = new GitContext())
{
IQueryable results = (from ch in db.CookiesHistory
where ch.GitUserId != null
where ch.MyCookieId == cookieId
group ch by new { ch.GitUserId, ch.MyCookieId, ch.SearchGitUser } into g
orderby g.Count() descending
select new { GitUserId = g.Key.GitUserId, MyCookieId = g.Key.MyCookieId, SearchGitUser = g.Key.SearchGitUser, Count = g.Count() }).Take(count);
return results;
}
}
public List<GitUser> FavoritesUsersListFromHistory(IQueryable users)
{
List<GitUser> favoritesList = new List<GitUser>();
using (var db = new GitContext())
{
foreach (CookiesHistory result in users)
{
var user = (from u in db.GitUsers
where u.Id == result.GitUserId
select new { u }).First();
favoritesList.Add(user.u);
}
}
return favoritesList;
}
public class FavoriteController
{
protected GitContext db;
public FavoriteController()
{
db=new GitContext();
}
public IEnumerable<GitUser> FavoritesUsers(int cookieId, int count)
{
return FavoritesUsersListFromHistory(TopFavoritesUsers(cookieId, count));
}
//create a class (CookiesHistoryDTO) to save the result of this query
public IQueryable<CookiesHistoryDTO> TopFavoritesUsers(int cookieId, int count)
{
IQueryable<CookiesHistoryDTO> results = (from ch in db.CookiesHistory
where ch.GitUserId != null
where ch.MyCookieId == cookieId
group ch by new { ch.GitUserId, ch.MyCookieId, ch.SearchGitUser } into g
orderby g.Count() descending
select new CookiesHistoryDTO{ GitUserId = g.Key.GitUserId, MyCookieId = g.Key.MyCookieId, SearchGitUser = g.Key.SearchGitUser, Count = g.Count() }
).Take(count);
return results;
}
public IEnumerable<GitUser> FavoritesUsersListFromHistory(IQueryable<CookiesHistoryDTO> user)
{
//Here the context you use to create your first query is still alive
var userIds=user.Select(e=>e.GitUserId).Contains(e.Id);
return db.GitUsers.Where(e=>userIds.Contains(e.Id)).ToList();// Here is when both query are going to be executed.
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}