2009-05-27 2 views
1

У меня возникают проблемы с запросом модели сущности для получения дополнительной информации.Entity Framework IQueryable

У моего db есть таблица программ, в которой отношение одного к большому с таблицей событий. Модель Entity создает отношения очень хорошо, но я не могу понять, как запросить модель, чтобы получить объект progam со своими событиями.

Я не могу это сделать:

var foo = from program in entities.ProgramSet 
      where program.StartDate > DateTime.now 
      orderby program.StartDate 
      select program; 

Никаких проблем нет. Из того, что я нашел на странице Microsoft (формирование запросов с помощью инфраструктуры Entity): msdn.microsoft.com/en-us/library/bb896272.aspx, если бы я хотел получить дочерние объекты, я просто делаю следующее:

// Define a LINQ query with a path that returns 
// orders and items for a contact. 
var contacts = (from contact in context.Contact 
      .Include("SalesOrderHeader.SalesOrderDetail") 
      select contact).FirstOrDefault(); 

Тем не менее, нет .Include или Include, которые я могу найти в запросе.

Любое предложение? Я знаю, что я могу сделать foreach по результатам, а затем запустить .Events.Load() на нем, но это не заставляет IQueriable результат выполнять sql, а не optomize его запускать только тогда, когда .ToList () и т. д.

Вот некоторые примеры код из моего проекта:

public class ProgramRepository : CT.Models.IProgramRepository 
{ 
    CTEntities db = new CTEntities(); 

    public IQueryable<Program> FindAllPrograms() 
    { 

     return db.ProgramSet; 
    } 
    public IQueryable<Program> FindUpcomingPrograms() 
    { 

     var programs = from program in FindAllPrograms() 

       where program.StartDate > DateTime.Now 
       orderby program.StartDate         
       select program; 
     return programs; 


    } 

С FindUpComingPrograms Я хотел бы, чтобы он также включает в себя событие данных. Существует связь между моделью «Программа и события». Программа имеет свойство < Events, которое я хотел бы заполнить и вернуть с помощью метода IQueryable.

Еще раз спасибо!

+0

не работали с EF, но вызов FirstOrDefault() сделает запрос выполненным в любом случае. – CSharpAtl

+0

Да, это будет, и я хотел бы избежать, образец с FirstOrDefault() был с веб-сайта Microsoft. – Mike

ответ

2

В поле Включить функции является частью объекта ObjectQuery ...

Я думаю, что вы будете нуждаться, чтобы повторно написать запрос, чтобы выглядеть следующим образом:

var contacts = context.Contact.Include("SalesOrderHeader.SalesOrderDetail").FirstOrDefault(); 

//Not sure on your dot path you might have to debug that a bit 

Вот Article что имеет несколько примеров ...

+0

Я предполагаю, что я ищу, как я, в контексте структуры Entity, запрашиваю Set и получаю связанные с ним дочерние элементы, чтобы объект заполнил список свойства связанного класса? И сделайте это так, чтобы вернуть его как IQueriable ? Спасибо – Mike

+0

Я также обнаружил, что могу пройти через CreateSourceQuery(), чтобы получить данные, на которые мне нужно, или перейти на веб-сайт Microsoft: http://code.msdn.microsoft.com/EFLazyLoading и install LazyLoading, так что, когда я получаю доступ к Program.Events, он будет загружать события прямо тогда и там, а не сразу. – Mike

Смежные вопросы