簡體   English   中英

如何在實體框架模型中的兩個SQL視圖上進行多聯接?

[英]How do I do a multi-join on two SQL Views in an Entity Framework Model?

我的模型中有兩個視圖。

我基本上需要基於三列對它們進行INNER JOIN:

  • 數據源
  • ShowID
  • 劇集ID

我不知道怎么做的第一件事是將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 ...

您可以在這里使用匿名類型,以在多個列之間進行連接,以及將其投影到包含來自連接雙方的數據的新類型中,從而發揮自己的優勢。 這是一個使用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; }
    }
}

因此,要加入,可以使用join關鍵字,然后使用on指定條件。 && (C#中的邏輯和運算符)將轉換為SQL AND關鍵字。

另外,在EF中,它們具有所謂的“隱式連接”,這意味着如果我的TableA帶有TableB的外鍵,則將其稱為fKey。

TableA.fKey == TableB.pKey地方TableA.fKey == TableB.pKey將導致提供程序在此處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 };

首先,您需要創建一個包含兩個視圖的列的輔助類,如下所示:

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,
                ...
             }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM