LINQ для возврата к хранимой процедуре объекта, который нуждается в дополнительных соединениях после факта - PullRequest
1 голос
/ 17 февраля 2012

У меня есть хранимая процедура, которая возвращает тип таблицы.Однако модель EF с хранимой процедурой возвращает только текущий класс таблицы, но не ассоциирует классы.Поэтому, когда я пересекаю свои ссылочные (дочерние / родительские) таблицы, я получаю нулевые значения везде для этих значений таблицы.

Я знаю, что это ожидается, поскольку хранимая процедура возвращает только эту таблицу (select * from the table),но теперь я хотел бы создать предложение объединения ПОСЛЕ вызова процедуры store для получения доступа к остальным ссылочным таблицам в моей модели EF.

Вот мой код, слегка измененный, чтобы было легче понять, чтоМне нужно ...

var coll = db.SearchContacts(keyword,param1,param2)
//returns Contact types,works great

... что бы я хотел сделать .... (хотя я знаю, что синтаксис отключен)

var ExtColl = coll join db.Address on coll.Address 
               join db.Department on coll.Department <- something similar 

... так чтоТеперь я могу получить доступ к информации об этом отделе (Department.desc) или адресе (address.civic) этого контакта.

Я затрудняюсь с тем, как реализовать этот стиль форматирования ПОСЛЕ того, как я ужеполучил его от хранимого процесса в БД.


Хорошо, вот обновление того, что я делаю ...

var ps = from d in db.SearchContacts(param1,param2)
         select d.Id;
var p = from e in db.Contacts
        .Include("Table1Ref")
        .Include("Table2Ref")
        .Include("Table3Ref")
        Where(BuildOrExpression<DBMOdel.Contact,long>(e=>e.Id,ps.ToList()))
        select e;

Теперь я получаю возврат.хочу, кроме одной вещи .... есть таблицы, которые повторноFerence далее ссылается на таблицы, которые я хотел бы добавить, и «Включить» не позволяет мне добавлять их в «Контакты» напрямую, поскольку эти таблицы не ссылаются на «Контакт», а на другую таблицу, которая ссылается на «Контакт» на один уровень / уровень далее ... поэтому контакты ссылаются на адрес и адресссылается на провинцию ... и мне нужно получить доступ к информации о провинции (например, к описанию), но мне нужно правильно завершить оператор объединения ....

Поэтому я подумываю использовать оператор объединения, но незнать синтаксис для назначения или присоединения такого рода ... Контакт -> Адрес по AdressId, Адрес -> Провинция по ProvinceId

Так что я думаю, что мой оператор linq будет выглядеть следующим образом ...

var p = from e in db.Contacts
        .Include("Table1Ref")
        .Include("Table2Ref")
        .Include("Table3Ref")
        Where(BuildOrExpression<DBMOdel.Contact,long>(e=>e.Id,ps.ToList()))
->      join o in db.Province on o.ProvinceId equals e.Address.ProvinceId
        select e;

но не получаю желаемого эффекта ... может кто-нибудь помочь?Я думаю, что я мог бы также смешивать linq для sql или объект с linq для сущности ... это ошибка, которую я получаю за это

"Тип ключевого селектора для вызова метода Join не являетсясравнимо с базовым поставщиком магазина. "

1 Ответ

2 голосов
/ 18 февраля 2012

Нет синтаксиса SQL для объединения таблиц с хранимыми процедурами, поэтому EF также не сможет этого сделать.

Альтернативы:

  • Выполнять объединения в памяти (linq to objects).
  • Выполните объединения в хранимой процедуре и сопоставьте ее с составным типом .

Вероятно, будет работать последняя опция (значительно) лучше, но менее гибок.Вам решать взвесить все за и против.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...