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访问表,但我该如何解决这个问题?

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

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
                });
            }