2013-06-12 1 views
0

У меня есть два вида в моей модели.Как мне выполнить множественное объединение двух представлений SQL в модели Entity Framework?

мне в принципе нужно сделать INNER JOIN на них основаны на трех колоннах:

  • DATASOURCE
  • ShowID
  • EpisodeID

Первое, что я не знаю, как do добавляет оператор SQL AND и выражение LINQ.

Во-вторых, я не знаю, как выбрать таблицу JOINED.

Может кто-нибудь дать мне руку?

var query = (from s in db.TVData_VW_ShowList 
         from z in db.TVData_VW_Schedule 
         where s.dataSource = z.dataSource 
         && s.ShowID = z.ShowID 
         && s.EpisodeId = z.EpisodeId select ... 

ответ

1

Вы можете использовать анонимные типы в вашу пользу здесь, как для объединения нескольких столбцов, так и для проекта в новый тип, содержащий данные с обеих сторон соединения. Вот пример использования Linq для объектов:

namespace LinqExample 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var Shows = new List<ShowData> { new ShowData { dataSource = "foo", EpisodeID = "foo", ShowID = "foo", SomeShowProperty = "showFoo" }}; 
      var Schedules = new List<ScheduleData> { new ScheduleData { dataSource = "foo", EpisodeID = "foo", ShowID = "foo", SomeScheduleProperty = "scheduleFoo" } }; 

      var results = 
       from show in Shows 
       join schedule in Schedules 
        on new { show.dataSource, show.ShowID, show.EpisodeID } 
        equals new { schedule.dataSource, schedule.ShowID, schedule.EpisodeID } 
       select new { show.SomeShowProperty, schedule.SomeScheduleProperty }; 

      foreach (var result in results) 
      { 
       Console.WriteLine(result.SomeShowProperty + result.SomeScheduleProperty); //prints "showFoo scheduleFoo" 
      } 

      Console.ReadKey(); 
     } 
    } 

    public class ShowData 
    { 
     public string dataSource { get; set; } 
     public string ShowID { get; set; } 
     public string EpisodeID { get; set; } 
     public string SomeShowProperty { get; set; } 
    } 

    public class ScheduleData 
    { 
     public string dataSource { get; set; } 
     public string ShowID { get; set; } 
     public string EpisodeID { get; set; } 
     public string SomeScheduleProperty { get; set; } 
    } 
} 
0

Так присоединиться вы можете использовать ключевое слово join затем использовать on указать условия. && (логический и оператор в C#) будет переведен в ключевое слово SQL AND.

Кроме того, в EF они имеют так называемые «неявные соединения», если у меня есть TableA с внешним ключом в TableB, назовите его fKey.

Выполнение задания TableA.fKey == TableB.pKey приведет к подключению провайдера. Для выбора вам просто нужно сделать;

select new { prop1 = TableA.Prop1, prop2 = TableB.Prop1 }

это создаст новый анонимный, который выбирает значения из обеих таблиц.

Ниже приведен более полный пример синтаксиса join. Я думаю, что он использует все, о чем вы просили;

var result = from a in TableA 
      join b in TableB on a.fKey equals b.pKey && b.Status equals 1 
      select new { a.Prop1, a.Prop2, b.Prop1 }; 
-1

Прежде всего, необходимо создать класс ДОПОЛНИТЕЛЬНОЕ, который содержит столбцы обоих взглядов, что-то вроде:

public class viewItem 
{ 
    public int ShowID { get; set; } 
    public int EpisodeID { get; set; } 
    public int dataSource { get; set; } 
    ... 
} 

тогда ваш LINQ-запрос будет:

var query = (from s in db.TVData_VW_ShowList 
      join z in db.TVData_VW_Schedule 
      on s.dataSource equals z.dataSource 
      where s.ShowID == z.ShowID 
      && s.EpisodeID == z.EpisodeID 
      select new viewItem { 
       ShowID = s.ShowID, 
       EpisodeID = s.EpisodeID, 
       dataSource = s.dataSource, 
       ... 
      } 
+0

Нет необходимости создавать класс. – evanmcdonnal

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