我的控制器获取方法
中有以下内容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。
答案 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
...