2016-08-06 2 views
1

Ich werde versuchen, meinen Code besser und ich nicht zu machen wissen, wie IQueryable zur nächsten FunktionWie bekomme ich IQueryable als Parameter in der nächsten Methode?

Fehler zu erhalten:

An exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll but was not handled in user code

Additional information: The operation cannot be completed because the DbContext has been disposed.

Das ist Problem:

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; 

Dieser Code ist vor Änderung:

  List<GitUser> favoritesList = new List<GitUser>(); 


     using (var db = new GitContext()) 
     { 
      var 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); 


      foreach (var result in results) 
      { 
       var user = (from u in db.GitUsers 
          where u.Id == result.GitUserId 
          select new { u }).First(); 

       favoritesList.Add(user.u); 
      } 

      return favoritesList; 

Dies ist Code nach Änderung:

+0

können Sie nicht bekommen 'IQueryable' von einer Verwendung! –

Antwort

1

Die erste Sache ist, dass der Fehler auf den Kontext zurückzuführen ist, den Sie verwenden, um die Abfrage zu erstellen, die übergeben wird, wenn Parameter zu dem Zeitpunkt, zu dem Sie versuchen, das Ergebnis zu durchlaufen, übergeben wurden. Also, meine erste Empfehlung ist, erstellen Sie Ihre Kontextvariable als eine globale Variable:

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); 
    } 
} 
Verwandte Themen