我想执行此查询:
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表达式包含对查询的引用 与不同的背景相关联。
答案 0 :(得分:1)
您无法在从多个上下文检索的一个查询数据中合并,这些多个上下文可能指向两个差异数据库或具有不同的选项,然后查询可能无法执行。
似乎每个存储库都创建自己的DataContext
对象并使用该对象检索数据。
要解决这个问题而不必传递上下文并在所有存储库之间共享它,您可能希望从Get()
方法返回List而不是IQueryable
。我不知道您是否认为Get()
正在执行查询但事实并非如此。它只是在IQueryable
中存储有关查询的信息。只有当您在.ToList();
方法中调用ShowSheet
时,才会执行Get()
的查询。
否则,您需要创建一个上下文并在此查询的所有存储库中使用它。您的选择是让存储库的构造函数(或Get()
方法本身)接受YourContext
参数。然后传递上下文:_sheetRepository.Get(context)
,以便它们共享同一个对象。