使用LINQ查询两个数据库

本文关键字:两个 数据库 LINQ 查询 使用 | 更新日期: 2023-09-27 18:14:20

在我的控制器get方法中有以下内容

private PeopleContext Peopledb = new PeopleContext();
private IARContext db = new IARContext();
    public ActionResult OwnerList()
    {        
        var owners = from s in db.Owners
                     where s.Dormant == false
                     orderby s.Post.PostName
                     select s;
        var viewModel = owners.Select(t => new OwnerListViewModel
        {
             Created = t.Created,
             Post = Peopledb.Posts.FirstOrDefault(x => x.PostId == t.SelectedPostId).PostName.ToString(),
        });
        return PartialView("_OwnerList", viewModel);
    }

当我尝试加载页面时,我得到了这个错误:

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

我知道问题是LINQ不能查询两种不同的上下文,但在这里尝试了几种解决方案,我似乎无法解决这个问题并成功查询Peopledb。post表查找要在数据库中显示的每个实例的相关PostName。主人桌子。

使用LINQ查询两个数据库

你可以试试:

var owners = (from s in db.Owners
                     where s.Dormant == false
                     orderby s.Post.PostName
                     select s).ToList();

这将执行一个context中的代码,并将另一个contextList<Owner>放在内存中。

还要查看.Select部分的执行情况,它是否为每个owner执行单独的查询?如果是这样,您应该对其进行优化,您可以事先使用ids获得posts,然后构建viewmodel

实体框架上下文只能与单个数据库一起工作。如果您想在这种情况下从另一个数据库获取数据,您可以创建代理视图,它将在您的dbcontext的db中反映此数据。

使用AsEnumerable():

从Linq-to-Entities转换到Linq-to-Objects
    var viewModel = owners.AsEnumerable()
                          .Select(t => new OwnerListViewModel
    ...