2015-09-24 6 views
1

У меня есть следующие в моем контроллере метод GETЗапрос две базы данных с помощью 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 косяка запрос два различных контексты, но попробовав несколько решений здесь я не могу показаться, чтобы решить эту проблему и sucesfully запроса таблицы Peopledb.Posts, чтобы найти соответствующую PostName для отображения для каждого экземпляра в таблице db.Owners.

+1

ли они на одном сервере? Создайте представление или синоним в IAR, чтобы получить таблицу, в которой вы нуждаетесь в People. – zimdanen

+0

И если они не находятся на одном сервере, могут помочь связанные серверы. – AFract

ответ

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.

+0

Добавив это, я теперь получаю ссылку на объект, не установленную на экземпляр объекта. no Post в представленииModel –

+1

Я считаю, что ошибка находится в '.Select', кажется, что у вас нет соответствующих записей, вы можете либо просто получить объект' post' (который в некоторых случаях будет пустым), либо вы может сделать «левое соединение» или вы можете проверить с помощью '.Any()' перед выполнением 'FirstOrDefault' –

+0

. Я обнаружил, что проблема с сохранением владельцев не передала PostId правильно, что разрешило вторую проблему. Спасибо –

0

Контекст Entity Framework может работать только с единой базой данных. Если вы хотите получить данные из другой базы данных в этом контексте, вы можете создать прокси-представление, которое будет отражать эти данные в db вашего dbcontext.

+0

Просто чтобы уточнить, имеете ли вы ссылку на связанный сервер, а на db есть представление, которое содержит данные, поэтому к нему можно получить доступ из dbcontext. –

+0

У него есть два контекста, хотя это приемлемо. Однако он ссылается на один из другого, что и вызывает проблемы. Я считаю, что ответ AD.Net будет правильным, поскольку он должен преобразовать первый в список(), чтобы заставить его запросить БД в этой точке и кэшировать его в памяти. –

+0

В этом случае он будет использовать больше памяти. –

0

Просто переход от Linq-на-Entities в Linq к объектам с помощью AsEnumerable():

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