Entity Framework 4 Linq help - извлечение данных из нескольких таблиц с фильтрацией - PullRequest
1 голос
/ 09 февраля 2011

Не уверен, как это сделать, я настроил .edmx так, чтобы свойства навигации соответствовали отношениям внешнего ключа в таблицах. Не уверен, что мне все еще нужно выполнять объединения или EF автоматически предоставит мне доступ к связанным данным таблицы через свойства навигации.

enter image description here

Что мне нужно сделать, это получить все ContentSections и связанные с ними ContentItems на основе ContentView и отфильтровать их по DiversionProgram.CrimeNumber.

Я хотел бы вернуть IEnumerable, для каждого ContentSection он должен иметь доступ к своим ContentItems через свойство навигации ContentItems

Спасибо

Ответы [ 4 ]

0 голосов
/ 22 июня 2012
 var query = from t1 in studentManagementEntities.StudentRegistrations
                        join t2 in studentManagementEntities.StudentMarks
                        on t1.StudentID equals t2.StudentID
                        select new
                        {
                            t1.selected column name,
                            t2.selected column name
                        };
0 голосов
/ 10 февраля 2011

Вы можете загрузить, чтобы получить все связанные записи, но когда вы хотите начать фильтрацию / упорядочение, не беспокойтесь о Include.

Просто сделайте прогноз с анонимными типами, и EF определит, что ему нужно делать. Это немного волосато, но это сработает. Если это слишком сложно, прикусить пулю и использовать SPROC.

Теперь, с этим предостережением, что-то вроде этого (с макушки головы):

var query = ctx.ContentView
               .Select(x => new 
{
   ContentSections = x.ContentSections
                      .Where(y => y.ContentItems
                        .Any(z => z.DivisionProgram.CrimeNumber = 87))
}).ToList().Select(x => x.ContentSections);
0 голосов
/ 10 февраля 2011

Если вы используете CTP5, вы можете сделать что-то очень уникальное, похожее на это:

var context = new YourEntitiesContext();

var query = context.ContentView.Include(cs => cs.ContentSections
                   .Select(ci => ci.ContentItems
                   .Select(dp => dp.DiversionProgram)
                   .Where(dp.CrimeNumber == crimeNumber)))
                   .Where(cv => cv.ContentViewID == contentViewID).FirtsOrDefault();

Вы можете узнать больше о CTP5 и о том, как его можно использовать в первом сценарии базы данных здесь

0 голосов
/ 09 февраля 2011

Что-то вроде:

using(Entities context = new Entities())
{
  IEnumerable<ContentSection> enumerator = context.ContentSections
  .Include("ContentItems")
  .Where<ContentSection>(cs => cs.ContentView.ContentViewID == someID && cs.ContentItems.Where<ContentItem>(ci => ci.DiversionProgram.CrimeNumber == someCrimeNumber))
  .AsEnumerable<ContentSection>
}

Я интерпретировал

на основе ContentView

как cs.ContentView.ContentViewID == someID

Это даст вам все ContentSections для данного ContentView.И интерпретировал

, отфильтрованный с помощью DiversionProgram.CrimeNumber

как cs.ContentItems.Where<ContentItem>(ci => ci.DiversionProgram.CrimeNumber == someCrimeNumber)

, который даст вам все те ContentItems, которые имеют определенный CrimeNumber.

Или вы имели ввиду что-то еще с помощью / отфильтровано.Может быть, OrderBy или все те ContentSections, где любой из его ContentItems будет иметь определенный CrimeNumber?

...