[英]How do I do a multi-join on two SQL Views in an Entity Framework Model?
我的模型中有兩個視圖。
我基本上需要基於三列對它們進行INNER JOIN:
我不知道怎么做的第一件事是將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.