LINQ について何かが欠けているようです。私には、SQL の最も気に入らない要素をいくつか取り、それらを C# 言語に移して、他の用途に使用しているように見えます。
つまり、データベース以外で SQL に似たステートメントを使用する利点を理解できたということです。しかし、もし SQL を書きたいのなら、SQL だけを書いて C# から除外してはどうでしょうか? ここで何が欠けていますか?
LINQ は SQL に関するものではありません。LINQ は、関数型プログラミング パラダイムをオブジェクトに適用することを目的としています。
LINQ to SQL は LINQ 基盤の上に構築された ORM ですが、LINQ はそれ以上のものです。私は LINQ to SQL を使用していませんが、常に LINQ を使用しています。
2 つのリストの交点を見つけるタスクを実行します。
LINQ の前は、このタスクでは、大きなリスト O(N*M) 内のすべての項目に対して小さなリストを 1 回反復するネストされた foreach を記述する必要があり、約 10 行のコードが必要でした。
foreach (int number in list1)
{
foreach (int number2 in list2)
{
if (number2 == number)
{
returnList.add(number2);
}
}
}
LINQ を使用して、1 行のコードで同じことを行います。
var results = list1.Intersect(list2);
LINQ のようには見えませんが、LINQ のようです。使用したくない場合は、式の構文を使用する必要はありません。
前:
// Init Movie
m_ImageArray = new Image[K_NB_IMAGE];
Stream l_ImageStream = null;
Bitmap l_Bitmap = null;
// get a reference to the current assembly
Assembly l_Assembly = Assembly.GetExecutingAssembly();
// get a list of resource names from the manifest
string[] l_ResourceName = l_Assembly.GetManifestResourceNames();
foreach (string l_Str in l_ResourceName)
{
if (l_Str.EndsWith(".png"))
{
// attach to stream to the resource in the manifest
l_ImageStream = l_Assembly.GetManifestResourceStream(l_Str);
if (!(null == l_ImageStream))
{
// create a new bitmap from this stream and
// add it to the arraylist
l_Bitmap = Bitmap.FromStream(l_ImageStream) as Bitmap;
if (!(null == l_Bitmap))
{
int l_Index = Convert.ToInt32(l_Str.Substring(l_Str.Length - 6, 2));
l_Index -= 1;
if (l_Index < 0) l_Index = 0;
if (l_Index > K_NB_IMAGE) l_Index = K_NB_IMAGE;
m_ImageArray[l_Index] = l_Bitmap;
}
l_Bitmap = null;
l_ImageStream.Close();
l_ImageStream = null;
} // if
} // if
} // foreach
後:
Assembly l_Assembly = Assembly.GetExecutingAssembly();
//Linq is the tops
m_ImageList = l_Assembly.GetManifestResourceNames()
.Where(a => a.EndsWith(".png"))
.OrderBy(b => b)
.Select(c => l_Assembly.GetManifestResourceStream(c))
.Where(d => d != null) //ImageStream not null
.Select(e => Bitmap.FromStream(e))
.Where(f => f != null) //Bitmap not null
.ToList();
または、代わりに (クエリ構文):
Assembly l_Assembly = Assembly.GetExecutingAssembly();
//Linq is the tops
m_ImageList = (
from resource in l_Assembly.GetManifestResourceNames()
where resource.EndsWith(".png")
orderby resource
let imageStream = l_Assembly.GetManifestResourceStream(resource)
where imageStream != null
let bitmap = Bitmap.FromStream(imageStream)
where bitmap != null)
.ToList();
したがって、LINQについての本当に、本当に大きな問題は、LinqtoSQLとは何の関係もありません。これは、C#言語自体にもたらされた機能強化に関するものです。
Jonathan が指摘したように、LINQ は単なる ORM システムではなく、多くの関数型プログラミング要素を C# にもたらします。また、通常の C# コードで多くの "データベースのような" ことを実行できます。それがどれほど信じられないほど強力なのかを説明するのは難しい. 一般的なフレームワークに含まれる堅固で適切に設計された一般的なデータ構造 (リスト、スタック、辞書/ハッシュなど) が、現代の言語の開発状況をどれだけ改善したかを考えてみてください。これらのデータ構造を使用することは非常に一般的であり、それらを使用することによる知的オーバーヘッドを削減することは大きな利点です。LINQ は自分でできないことは何もしませんが、多くの操作をより簡単かつ簡単にします。
順序付けられていないリストから重複を削除する昔ながらの例を考えてみましょう。C や C++ のような低レベルの言語では、おそらくリストをソートし、複製を削除したときにリスト内の 2 つのインデックスを維持する必要があります。ハッシュを使用する言語 (Java、C#、Javascript、Perl など) では、キーが一意の値であるハッシュを作成し、キーを新しいリストに抽出できます。LINQ を使用すると、次のことができます。
int[] data = { 0, 1, 3, 3, 7, 8, 0, 9, 2, 1 };
var uniqueData = data.GroupBy(i => i).Select(g => g.Key);
要点は、LINQ がクエリを主要なプログラミング言語に統合し、IDE が他の方法では提供できないいくつかの機能 (Intellisense やデバッグのサポートなど) を提供できるようにし、コンパイラが SQL の型をチェックできるようにすることです。コード (通常の文字列クエリでは不可能です)。