質問

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 に関する本当に本当に重要なことは、Linq to SQL とは何の関係もありません。これは、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 は実際には SQL の衣を着たモナドであるため、継続モナドを使用して非同期 Web リクエストを行うプロジェクトでこれを使用していますが、非常にうまく機能することが証明されています。

以下の記事をご覧ください。http://www.aboutcode.net/2008/01/14/Async+WebRequest+Using+LINQ+Syntax.aspx http://blogs.msdn.com/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx

最初の記事から:

    var requests = new[] 
    {
        WebRequest.Create("http://www.google.com/"),
        WebRequest.Create("http://www.yahoo.com/"),
        WebRequest.Create("http://channel9.msdn.com/")
    };

    var pages = from request in requests
                select
                    from response in request.GetResponseAsync()
                    let stream = response.GetResponseStream()
                    from html in stream.ReadToEndAsync()
                    select new { html, response };

    foreach (var page in pages)
    {
        page(d =>
        {
            Console.WriteLine(d.response.ResponseUri.ToString());
            Console.WriteLine(d.html.Substring(0, 40));
            Console.WriteLine();
        });
    }

重要なのは、LINQ はクエリを主要なプログラミング言語に統合し、IDE が他の方法では提供できないいくつかの機能 (インテリセンスやデバッグ サポートなど) を提供できるようにし、コンパイラが SQL を型チェックできるようにすることです。コード(通常の文字列クエリでは不可能です)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top