2016-07-28 31 views
2

我想執行這個查詢到與不同的上下文中的錯誤在C#相關的查詢引用:指定的LINQ表達式包含

public List<ViewSheet> ShowSheet(List<Sheet> lst) 
{ 
    var res = (from sheet in _sheetRepository.Get() 
     join line in _lineRepository.Get() on sheet.LineId equals line.Id 
     join basemat in _baseMaterialRepository.Get() on sheet.BaseMaterialId equals basemat.Id 
     join lineend in _lineEndRepository.Get() on sheet.LineEndId equals lineend.Id 
     join Paint in _paintCodeRepository.Get() on sheet.PaintCodeId equals Paint.Id 
     select new ViewSheet() 
     { 
      BaseMaterialId = basemat.Name, 
      Catagory = sheet.Catagory, 

      LineEndId = lineend.Name, 
      LineId = line.LineNumber, 
      MtPercent = sheet.MtPercent, 
      PAndId = sheet.PAndId, 
      PaintCodeId = Paint.Name, 
      ParentId = sheet.ParentId, 

     }).ToList(); 
    return res; 
} 

,你可以看到我創建4個表和get函數之間的連接這種結構:

public interface ISheetRepository 
{ 
    IQueryable<Sheet> Get(); 
    bool Save();  
} 

,但我得到這個錯誤:

指定的LINQ前壓力包含對與不同上下文關聯的 查詢的引用。

回答

1

你不能從多個上下文檢索一個查詢的數據結合起來,這些多重執行緒可能指向兩個差異數據庫或有不同的選擇,那麼查詢可能不會執行。

似乎每個存儲庫都會創建自己的DataContext對象並使用該對象檢索數據。

要解決這個問題,無需傳遞上下文並在所有存儲庫之間共享,您可能想要返回Get()方法中的列表,而不是IQueryable。我不知道你是否認爲Get()正在執行查詢,但它不是。它只是在IQueryable中存儲有關查詢的信息。只有當您在ShowSheet方法內調用.ToList();時,纔會執行Get()的查詢。

否則,您需要創建一個上下文,並在此查詢的所有存儲庫中使用它。您的選擇是使存儲庫的構造函數(或Get()方法本身)接受YourContext參數。然後你傳遞上下文:_sheetRepository.Get(context),以便它們都共享同一個對象。

相關問題