【问题标题】:Query two databases using LINQ使用 LINQ 查询两个数据库
【发布时间】:2015-09-25 00:00:30
【问题描述】:

我的控制器 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.Posts 表以找到相关的 PostName 以显示数据库中的每个实例.Owners 表。

【问题讨论】:

  • 他们在同一个服务器上吗?在 IAR 中创建视图或同义词,以在 People 中为您提供所需的表。
  • 如果它们不在同一台服务器上,链接服务器可能会有所帮助。

标签: c# .net entity-framework linq


【解决方案1】:

你可以试试这个:

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

这将在一个context 中执行代码,并在内存中为另一个context 保存List<Owner>。

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

【讨论】:

  • 添加后,我现在得到对象引用未设置为对象的实例。没有 viewModel 中的 Post
  • 我相信错误在.Select,看来您没有匹配的记录,您可以获取post 对象(在某些情况下为空)或者您可以做一个left join 或者你可以在做FirstOrDefault之前检查.Any()
  • 我发现了保存所有者的问题,它没有正确传递 PostId,这解决了第二个问题。谢谢
【解决方案2】:

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

【讨论】:

  • 只是澄清一下,您的意思是有一个链接服务器,并且在 db 上有一个包含数据的视图,因此可以从 dbcontext 访问它
  • 他有两个上下文,这是可以接受的。但是,他是从另一个内部引用一个,这就是导致问题的原因。我相信 AD.Net 的回答是正确的,因为他需要将第一个转换为 List() 以强制它此时查询数据库并将其缓存在内存中。
  • 在这种情况下他会使用更多的内存。
【解决方案3】:

只需使用 AsEnumerable() 从 Linq-to-Entities 转换到 Linq-to-Objects:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    相关资源
    最近更新 更多