【问题标题】:Linq Lambda Error : The specified LINQ expression contains references to queries that are associated with different contextsLinq Lambda 错误:指定的 LINQ 表达式包含对与不同上下文关联的查询的引用
【发布时间】:2021-11-12 05:37:00
【问题描述】:

我收到这个错误,我尝试了很多解决它,但我收到其他错误,有解决办法吗?

using (var contextDb1 = new Db1Context(System.Web.HttpContext.Current.Session["DB1ConnectionString"].ToString(), false))
{
    using (var contextDb2 = new Db2Context(System.Web.HttpContext.Current.Session["DB2ConnectionString"].ToString(), false))
    {   
        var messagesList = contextDb2.Messages
            .Select(m => new MessagesViewModel
            {
                UserName = contextDb1.UsersInfo.FirstOrDefault(u=>u.Id == m.UserId).UserName,
                MessageId = m.MessageId,
                MessageText = m.MessageText,
                DateTime = m.DateTime
            })
            .ToList();

        return messagesList;   
    }
}

【问题讨论】:

  • 尝试通过 LINQ 和 EF 同步两个数据库?
  • 在获取消息之前尝试获取用户定义类型列表中的 contextDb1.UsersInfo 并使用该列表获取用户名。
  • @SvyatoslavDanyliv 在第二个数据库(Db2)中,我有一个包含消息的表,其中包含编写消息的用户的 ID,但用户信息(例如用户名)在另一个数据库(Db1)中,并且我想显示带有用户名的消息...但出现上述错误
  • @Smits ,不好意思没看懂你,其实我试了很多办法都无济于事,不知道怎么办,能不能把上面的代码改正一下?

标签: c# asp.net-mvc entity-framework linq lambda


【解决方案1】:

您不能通过同一个 LINQ 查询来查询两个不同的数据库。但是您可以使用中间结果对数据库执行两个查询,然后合并结果。

using (var contextDb1 = new Db1Context(System.Web.HttpContext.Current.Session["DB1ConnectionString"].ToString(), false))
using (var contextDb2 = new Db2Context(System.Web.HttpContext.Current.Session["DB2ConnectionString"].ToString(), false))
{   
    var rawMessages = contextDb2.Messages
        .Select(m => new 
        {
            m.UserId
            m.MessageId,
            m.MessageText,
            m.DateTime
        })
        .ToList();

    var userIds = rawMessages.Select(x => xu.UserId);
    
    var usersInfo = contextDb1.UsersInfo.Where(u => userIds.Contains(u.Id))
        .Select(u =>  new 
        {
            UserId = u.Id,
            UserName = u.UserName
        });

    var messageQuery = 
        from m in rawMessages
        join u in usersInfo.AsEnumerable() on m.UserId equals u.UserId into gj
        from u in gj.DefaultIfEmpty()
        select new MessagesViewModel
        {
            UserName = u?.UserName,
            MessageId = m.MessageId,
            MessageText = m.MessageText,
            DateTime = m.DateTime
        };
    
    var messagesList = messageQuery.ToList();

    return messagesList;   
}

【讨论】:

  • 要考虑的另一种方法是将两个数据库上下文放入单独的方法中。创建调用这两个方法的第 3 个方法,然后在那里转换最终输出。如果不能保证这些查询始终可用,这可能有助于跟踪堆栈跟踪以了解失败的位置。
猜你喜欢
  • 2011-11-12
  • 2011-07-30
  • 1970-01-01
  • 2018-05-09
  • 2016-12-02
  • 2011-10-24
相关资源
最近更新 更多