LINQ表达式包含对与不同上下文关联的查询的引用
本文关键字:关联 上下文 查询 引用 表达式 包含 LINQ | 更新日期: 2023-09-27 18:25:20
这是我的代码:
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表达式包含对与不同上下文关联的查询的引用。"这是因为它无法同时连接到两个上下文,所以我找到了如下解决方案。在这个例子中,我想列出带有所有者名称的彩票卡,但具有所有者名称的表在另一个数据库中。因此,我创建了两个上下文DB1Context和DB2Context。并编写如下代码:
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<LotteryCardMaster>();
foreach (var result in query)
{
AB.LottryList.Add(new LotteryCardMaster()
{
CashCardID = result.CashCardID,
CashCardNO = result.CashCardNO,
PersonnelName =result.PersonnelName,
Status = result.Status
});
}
但这给了我上面的错误,所以我找到了另一种方法来对diffrent数据库中的两个表执行连接。方法如下。
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<LotteryCardMaster>();
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
});
}