2 つのシーケンスの連結
2 つのシーケンスを連結するには、Concat 演算子を使用します。
Concat 演算子は、受信側と引数の順序が同じである、順序付けされたマルチセットに対して定義されます。
SQL での順序付けは、結果が作成される前の最終段階です。 このため、Concat 演算子は UNION ALL
を使用して実装され、その引数の順序を保持しません。 結果内での順序付けを正しく行うには、結果の順序を明示的に指定する必要があります。
例 1
この例では、Concat を使用して、すべての Customer
と Employee
の電話番号と FAX 番号のシーケンスを返します。
IQueryable<String> custQuery =
(from cust in db.Customers
select cust.Phone)
.Concat
(from cust in db.Customers
select cust.Fax)
.Concat
(from emp in db.Employees
select emp.HomePhone)
;
foreach (var custData in custQuery)
{
Console.WriteLine(custData);
}
Dim custQuery = _
(From c In db.Customers _
Select c.Phone) _
.Concat _
(From c In db.Customers _
Select c.Fax) _
.Concat _
(From e In db.Employees _
Select e.HomePhone)
For Each custData In custQuery
Console.WriteLine(custData)
Next
例 2
この例では、Concat を使用して、すべての Customer
と Employee
の名前と電話番号のマッピングのシーケンスを返します。
var infoQuery =
(from cust in db.Customers
select new { Name = cust.CompanyName, cust.Phone }
)
.Concat
(from emp in db.Employees
select new
{
Name = emp.FirstName + " " + emp.LastName,
Phone = emp.HomePhone
}
);
foreach (var infoData in infoQuery)
{
Console.WriteLine("Name = {0}, Phone = {1}",
infoData.Name, infoData.Phone);
}
Dim infoQuery = _
(From cust In db.Customers _
Select Name = cust.CompanyName, Phone = cust.Phone) _
.Concat _
(From emp In db.Employees _
Select Name = emp.FirstName & " " & emp.LastName, _
Phone = emp.HomePhone)
For Each infoData In infoQuery
Console.WriteLine("Name = " & infoData.Name & _
", Phone = " & infoData.Phone)
Next