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

这是我的代码:

var myStrings = (from x in db1.MyStrings.Where(x => homeStrings.Contains(x.Content)) join y in db2.MyStaticStringTranslations on x.Id equals y.id select new MyStringModel() { Id = x.Id, Original = x.Content, Translation = y.translation }).ToList(); 

我得到的错误是指定的LINQ表达式包含对与不同上下文关联的查询的引用。 我知道问题是我尝试从db1和db2访问表,但我该如何解决这个问题?

MyStrings是一张小桌子

在内存中加载过滤的MyStrings ,然后使用LINQ与MyStaticStringTranslations连接:

 // Read the small table into memory, and make a dictionary from it. // The last step will use this dictionary for joining. var byId = db1.MyStrings .Where(x => homeStrings.Contains(x.Content)) .ToDictionary(s => s.Id); // Extract the keys. We will need them to filter the big table var ids = byId.Keys.ToList(); // Bring in only the relevant records var myStrings = db2.MyStaticStringTranslations .Where(y => ids.Contains(y.id)) .AsEnumerable() // Make sure the joining is done in memory .Select(y => new { Id = y.id // Use y.id to look up the content from the dictionary , Original = byId[y.id].Content , Translation = y.translation }); 

你是对的,db1和db2不能在同一个Linq表达式中使用。 x和y必须在此过程中加入,而不是由Linq提供者加入。 试试这个:

 var x = db1.MyStrings.Where(xx => homeStrings.Contains(xx.Content)).ToEnumerable(); var y = db2.MyStaticStringTranslations.ToEnumerable(); var myStrings = (from a in x join b in y on x.Id equals y.id select new MyStringModel() { Id = x.Id, Original = x.Content, Translation = y.translation }).ToList(); 

有关更多详细信息,请参阅此答案: 指定的LINQ表达式包含对与不同上下文关联的查询的引用

dasblinkenlight的答案有一个比这更好的整体方法。 在这个答案中,我正在尝试最小化与原始代码的差异。

我也遇到了同样的问题:“指定的LINQ表达式包含对与不同上下文关联的查询的引用。” 这是因为它无法一次连接到两个上下文,所以我找到了如下解决方案。 在这个示例中,我想列出具有所有者名称的彩票卡,但具有所有者名称的表位于另一个Database.So我做了两个上下文DB1Context和DB2Context.and编写如下代码:

  var query = from lc in db1.LotteryCardMaster from om in db2.OwnerMaster where lc.IsActive == 1 select new { lc.CashCardID, lc.CashCardNO, om.PersonnelName, lc.Status }; AB.LottryList = new List(); foreach (var result in query) { AB.LottryList.Add(new LotteryCardMaster() { CashCardID = result.CashCardID, CashCardNO = result.CashCardNO, PersonnelName =result.PersonnelName, Status = result.Status }); } 

但这给了我上面的错误,所以我找到了另一种方法来执行从不同数据库连接两个表。这种方式如下。

 var query = from lc in db1.LotteryCardMaster where lc.IsActive == 1 select new { lc.CashCardID, lc.CashCardNO, om.PersonnelName, lc.Status }; AB.LottryList = new List(); foreach (var result in query) { AB.LottryList.Add(new LotteryCardMaster() { CashCardID = result.CashCardID, CashCardNO = result.CashCardNO, PersonnelName =db2.OwnerMaster.FirstOrDefault(x=>x.OwnerID== result.OwnerID).OwnerName, Status = result.Status }); }