| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
編集の要約なし
==プログラミングC#(2) LINQ== | [[言語 まとめ 言語まとめ C#Sharp]] | [[C#Sharp]] | [[C# Sharp サンプルコード]] | [[Effective C# Sharp 4.0]] | [[Universal Windows Platform]] | [[Visual Studio]]| {{amazon|4873116503}}
==プログラミング[[C#]](2) LINQ==*[[プログラミングC Sharp 第7版|プログラミングC# 第7版]]*[[プログラミングC Sharp 第7版(1)|プログラミングC# 第7版(1)]]
{{amazon|4873116503}}
{{amazon|4798153826}}
*https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
==基本==
*言語統合クエリ[[言語]]統合クエリ*連携して動作するいくつかの言語要素から構成連携して動作するいくつかの[[言語]]要素から構成
**クエリ式
**LINQ演算子
**LINQプロバイダ
*[[.NET ]] Framework
====オブジェクト用====
*LINQ to Objects
====データベース用====
*[[SQL Server用 Server]]用 LINQ to SQL
*汎用 LINQ to Entities
====WCFデータサービスクライアント====
=====例1=====
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
IEnumerable[[IE]]numerable<int> odd =
from num in nums
where num % 2 == 1
=====データソース=====
*クエリのソースを確定
*IEnumerable[[IE]]numerable/IEnumerable[[IE]]numerable<T> インターフェース、またはその派生インターフェースを実装していることだけが条件
*foreachで処理できるオブジェクトであれば利用できる
**オブジェクト配列、データセット、XElementオブジェクト配列など
*出力を決定
*出力結果の型は、select句もしくはgroup句によって決まる
*すべてのクエリ式が IEnumerable[[IE]]numerable<T> となるわけではない
**プロバイダによって決まる
**var を結果利用することが一般的
=====例1=====
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
IEnumerable[[IE]]numerable<int> odd = nums
.Where(num => num % 2 == 1)
.OrderByDescending( book=> book.Title)
*クエリ式で、サブ式の結果を格納して後の句で使用すると便利な場合があります。 let キーワードを使用すると、これを行うことができます
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
IEnumerable[[IE]]numerable<int> odd =
from num in nums
let r = num % 2
===LINQ、ジェネリックとIQueryable<T>===
*ほとんどのLINQプロバイダでは、ジェネリック型が使われている
*LINQ to Objects では IEnumerable[[IE]]numerable<T> が使われている
*データベース用プロバイダでは、IQueryable<T> を使うものがある
==標準LINQ演算子==
**単純な項目に対して複雑なクエリを実行できる
**ほとんどの演算子が項目の集合を表す型を引数に取るだけでなく結果として返す
**LINKQ演算子は数学的な関数LINKQ演算子は[[数学]]的な関数
*入力に影響を与えない
*結果は新しく生成される
**インデックスを伴うWhere演算子
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
IEnumerable[[IE]]numerable<int> odd
= nums.Where((r, idx) => { Console.WriteLine($"IDX:{idx}"); return r % 2 == 1; });
*条件に合ったオブジェクトがない場合空のシーケンスを生成
====射影とマップ====
*Select演算子は射影と呼ばれることがあるが、mapと同じもの
*Selectは概念的には Selectは[[概念]]的には Map Reduce の一部と同じ命令(LINQでは reduce に対して Aggregate と命名)
====SelectMany====
*複数のfrom句を持つクエリ式の中で使用される
int[] nums = { 1, 2, 3, 4, 5 };
char[] alphas = { 'a', 'b', 'c', 'd', 'e' };
IEnumerable[[IE]]numerable<string> strs = from num in nums
from alpha in alphas
select alpha + num.ToString()
int[] nums = { 1, 2, 3, 4, 5 };
char[] alphas = { 'a', 'b', 'c', 'd', 'e' };
IEnumerable[[IE]]numerable<string> strs = nums.SelectMany(num => alphas, (num,alpha) => alpha + num.ToString());
====取得列を明示的に指定====
**項目を引数にとる
**--IList<T>を実装するコレクションの場合、IList<T> のContains が利用される
**項目+IEqualityComparer項目+[[IE]]qualityComparer<T> 型の引数をとる
====Any====
*コレクションが特定の条件を満たす値を1つ以上含んでいるか
*predicateをとる
**intを返す
condition.ResultCount [[R]]esultCount = db.SearchConditionResultsSearchCondition[[R]]esults.Count(src => src.SearchConditionId == condition.Id);
====LongCount====
*非常に大きな値の個数
&& table.tabname == id
select table).SingleOrDefault();
====[[その他]]====
{|class="wikitable"
!機能
|Last,LastOrDefault
|-
|指定した数の要素をスキップしてその他すべてを返す指定した数の要素をスキップして[[その他]]すべてを返す
|Skip
|-
*2つのソースをまとめる
*一般的な集合演算
*数学の集合とは異なる[[数学]]の集合とは異なる
====Distinct====
**--重複を取り除く
**どちらか、もしくは両方に含まれる
====シーケンス全体を扱ったり、順序を維持するための演算子====
====Reverse[[R]]everse====
*要素の順序を反転
====Concat====
}
==シーケンスの生成==
====Enumerable.Range[[R]]ange====*2つのintをとり、2つ目の引数まで1づつ大きくなるIEnumerable2つのintをとり、2つ目の引数まで1づつ大きくなる[[IE]]numerable<int>を返す====Enumerable.Repeat[[R]]epeat<T>====
*型Tと回数を引数にとり、指定した回数生成する
====Enumerable.Empty<T>====
*要素のないIEnumerable要素のない[[IE]]numerable<T>が返される
==他のLINQの実装==
===Entity Framework===
====LINQ to Entities====
*[[.NET ]] Frameworkの一部
*データベースとオブジェクト層を対応づけ
*複数のデータベースベンダ製品がサポート
*IQueryable<T> を使用
**IEnemerable[[IE]]nemerable<T> から派生しているのでLINQ to Objectsの演算子を利用できる
*匿名メソッドやデリゲートは使用できない
====LINQ to [[SQL]]====*[[SQL ]] サーバー専用の設計*[[.NET ]] API として設計
*テーブルオブジェクトが、IQueryable<T> を実装
====WCF データサービスクライアント====
*Open Data Protocol(OData)を使用してHTTP上でデータを表現したり消費するを使用して[[HTTP]]上でデータを表現したり消費する*XML もしくは [[JSON]]
*IQueryable<T>を使用
*一部のLINQ演算子のみサポート
===Parallel LINQ===
====クエリの結果を取得する際、可能であれば使用可能なCPU資源を効率的に使用するため、スレッドプールを使ったマルチスレッドの評価が行われる====
====LINQ to [[XML]]====
*LINQプロバイダではない
*XMLを作成すしたり、パースするためのAPI[[XML]]を作成すしたり、パースするためのAPI*XML文書に対して簡単にLINQクエリを実行できるように設計されている[[XML]]文書に対して簡単にLINQクエリを実行できるように設計されている*XML文書を [[.NETオブジェクトモデルで表現することで実現NET]]オブジェクトモデルで表現することで実現*完全に[[.NETに向けて設計されているため、CNET]]に向けて設計されているため、C#技術と非常によく統合されている
*LINQ to Objectsと同様な方法でクエリの定義、実行が可能
===[[Reactive Extensions]]===
*LINQ演算子が様々な型とともに動作する仕組みをうまく表している

案内メニュー