指定的LINQ表达式包含对c#

时间:2016-07-28 04:41:32

标签: c# entity-framework linq join

我想执行此查询:

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 个答案:

答案 0 :(得分:1)

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

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

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

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