この記事では、著者がLinqジョイントクエリを詳しく紹介しています。読者がこの点をあまりよく理解していないかもしれないため、まずLinqジョイントクエリについて話す前に、いくつかの知識を伝え、その後Linqジョイントクエリがどのように実装されているかについてお伝えします。お役に立てればと思います。
まず、Linqのジョイントクエリに関するいくつかの知識点を理解しましょう。
1. 匿名型の配達方式
static void Main(string[] args) { var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); Console.Write(User.UserName); } 静的オブジェクト GetAnonymous() { var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; ユーザーに戻る;
} 匿名型を定義すると、それはオブジェクト型を通過するだけで、コンパイラはパスした後の匿名型の実際の型を知りません。
この線はキャストエクステンション法で鋳造できます。 以下はキャスト法のプロトタイプです。
パブリック静的T キャスト(このオブジェクトo, T t) { return ();
} 2. Linqのフェデレーテッドクエリの匿名タイプリストを生成する方法?
var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); var list = 新しいリスト<?>(); 原理は上記と同じです。
var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); リスト。 Add(ユーザー); Console.Write(list[0]. ユーザー名); MakeList() メソッドを見てみましょう。
public static List MakeList(このT t) { 新しいリストを返す();
} もちろん、上記の方法が十分でないと思うかもしれませんし、リストにユーザーを追加する必要があるため、以下の方法を選びます。
公開静的リスト MakeList(このT t、params T[] 項目) { 新しいリスト(アイテム)を返す; } 呼び出すと、次のように書けます:
var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(User); Console.Write(list[0]. ユーザー名); 今回は本題に入り、Linqフェデレーテッドクエリの実装方法を理解しましょう。
var q = pからdb。 製品 ここでp.Supplier.Country == 「USA」&& p.UnitsInStock == 0 pを選択し、 上記のクエリは2つの関連するテーブルで構成されており、1つのテーブルの内容のみが返されます。この場合、強型リストをデータレイヤーで返すことができます。 例えば:
公開リスト SelectProducts() { var q = pからdbに入ります。 製品 ここでp.Supplier.Country == 「USA」&& p.UnitsInStock == 0 pを選択し、 q.ToListを返す;
} 返される結果セットが2つ以上の表の場合、どのようにしてパスすればよいのでしょうか? もし返される結果セットが1行のデータであれば、先に述べた匿名型の配信方法を使って必要な結果が得られると考えたはずです。 パブリックオブジェクト
パブリックオブジェクトSelectProducts() { var q = pからdbに入ります。 製品 ここでp.Supplier.Country == 「USA」&& p.UnitsInStock == 0 新しい{p.UnitsInStock, p.Supplier.Sid}を選択し; var result = q.Single(); リターン結果;
} しかし、この前提は、ビジネスロジック層がデータ層内の特定の匿名性タイプを知る必要があるということです。 この層状の構成はあまり重要ではありません。 これは私たちが望んでいることではありません。 さらに、匿名リスト型を使って複数行データの結果セットを返す方法も実験後に失敗しました。 つまり、この記事冒頭で匿名性を伝える2つの方法はどちらも機能しません。
方法1:Linq連合クエリは、リターン型と同じ構造を持つクラスをカスタマイズします
パブリッククラス CustomQuery { パブリック uint UnitsInStock { get; セット; } パブリック・イント・シド { get; セット; }
} これはクエリ結果が複数のテーブルの結果セットである場合に解決できます。 返される匿名性の種類を知る必要があるため、多層に適合しないクラスに加えて追加のクラスを定義する必要があります。 しかしこれは真実であり、強い型を用いて必要な結果を返すことができます。
方法2:System.Func委任を用いたLinqフェデレーテッドクエリ(参照:C# 3.0のメソッドからvarを返す)
データ層:
public IEnumerable GetCustomersWithOrders(Func, 投影>投影) { _customersのお客様からの帰還 let customerOrders = from order in _orders ここで順序。 CustomerID = customer.ID 予測を選択し(顧客、顧客注文);
} ビジネスロジック層:
var results = GetCustomersWithOrders( (お客様、注文)=新品> { 名前 = 顧客。 名前、 OrderCount = 順序数。 伯爵() }); このようにして返される結果は、ビジネスロジック層で真の匿名型であり、直接利用可能です。
方法3:Linqの連邦クエリはストアドプロシージャやビューを使用します。 |