使用LINQ查询两个数据库

时间:2015-09-24 15:26:07

标签: c# .net entity-framework linq

我的控制器获取方法

中有以下内容
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.Posts表以找到要为db中的每个实例显示的相关PostName .Owners table。

3 个答案:

答案 0 :(得分:2)

你可以试试这个:

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

这将在一个context中执行代码,并在内存中为其他List<Owner>提供context

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

答案 1 :(得分:0)

实体框架上下文只能用于单个数据库。如果要在此上下文中从另一个数据库获取数据,可以创建代理视图,该视图将在dbcontext的数据库中反映此数据。

答案 2 :(得分:0)

使用AsEnumerable()从Linq到实体转换为Linq到对象:

    var viewModel = owners.AsEnumerable()
                          .Select(t => new OwnerListViewModel
    ...