指定的LINQ表达式包含对c#中与不同上下文错误关联的查询的引用

我想执行这个查询:

public List ShowSheet(List 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 Get(); bool Save(); } 

但我得到这个错误:

指定的LINQ表达式包含对与不同上下文关联的查询的引用。

您无法在从多个上下文检索的一个查询数据中组合,这些多个上下文可能指向两个差异数据库或具有不同的选项,则查询可能无法执行。

似乎每个存储库都创建自己的DataContext对象并使用该对象检索数据。

要解决这个问题而不必传递上下文并在所有存储库之间共享它,您可能希望从Get()方法返回List而不是IQueryable 。 我不知道你是否认为Get()正在执行查询但事实并非如此。 它只是在IQueryable存储有关查询的信息。 只有当你调用.ToList();ShowSheet方法中, Get()的查询被执行。

否则,您需要创建一个上下文并在此查询的所有存储库中使用它。 您的选择是让存储库的构造函数(或Get()方法本身)接受YourContext参数。 然后传递上下文: _sheetRepository.Get(context)以便它们共享同一个对象。