LINQ 可以用來查詢多個列表、資料表連接後的資料,請見後方的說明。
撰寫方式
假設分別有 Status 類別的 status 列表、Parameters 類別的 parameters 列表,可以使用以下 LINQ 語法連接兩個列表,以檢索相關欄位。類似於 SQL 的 SELECT、WHERE 和 JOIN 運算子,不同的在 LINQ 使用 join 連接時要使用 equals 來連接,而且 select 語法需要擺在最後方:
var result = from s in status
join p in parameters on s.ID equals p.ID
where s.ID == userID && p.Class == userClass
select new { s.ID, s.IsOnline, n.Class, n.Level};
select 的結果是匿名類別的集合,可以使用一般操作清單的方式取得資料,並存取查詢結果的欄位。例如:
var first = result.First();
Console.WriteLine($"{first.ID}, {first.IsOnline} - {first.Class}, {first.Level}");
以上的結果相當於查詢資料庫時使用 INNER JOIN 連接資料表,如果需要寫出 LEFT JOIN 的話,則需要使用 DefaultIfEmpty()
方法回傳 null 物件。
參考資料
範例程式碼
public class Status
{
public int ID { get; set; }
public bool IsOnline { get; set; }
}
public class Parameter
{
public int ID { get; set; }
public string Class { get; set; }
public int Level { get; set; }
}
public static void Main()
{
List<Status> status = new List<Status>()
{
new Status { ID = 1, IsOnline = true },
new Status { ID = 2, IsOnline = false },
new Status { ID = 3, IsOnline = true },
new Status { ID = 4, IsOnline = true }
};
List<Parameter> parameters = new List<Parameter>()
{
new Parameter { ID = 1, Class = "A", Level = 3 },
new Parameter { ID = 2, Class = "B", Level = 2 },
new Parameter { ID = 3, Class = "A", Level = 1 },
new Parameter { ID = 4, Class = "C", Level = 3 }
};
int userID = 1;
string userClass = "A";
var result = from s in status
join p in parameters on s.ID equals p.ID
where s.ID == userID && p.Class == userClass
select new { s.ID, s.IsOnline, p.Class, p.Level};
var first = result.First();
Console.WriteLine($"{first.ID}, {first.IsOnline} - {first.Class}, {first.Level}");
}