2009-05-02 20 views
4

一般的にlinqの欠点は何ですか? (SQLの例LINQ) linqの欠点

  • アウトオブプロセスLINQ(時間的に)その原因からエラーを分離することができ

  • 答えて

    5
    • は、あなたが最初にそれを
    • 繰延実行を開始するときに理解することは難しいことができます常に多少漏れやすい抽象化になります - あなたは、本質的

    、私はまだLINQを愛していないどのような動作し、何を知っておく必要があり、大規模:)

    EDITかかわら:この短いリチウムを書きましたst、私はa very similar questionへの答えがあることを思い出しました...

    0

    実際に私は欠点を考えることができません。多くのことがよりコンパクトではあるが読みやすい方法で書かれているため、プログラミングの時間が大幅に短縮されます。

    しかしこれを言って、私はあなたが何をやっているのかを考えなければならないということにも同意しなければなりません。

    0

    それが持っている唯一の欠点は、その性能はプログラミングで任意の抽象化と同じように、このarticle

    +1

    それでは欠点はありません!その記事で測定されたオーバーヘッドは、実際のアプリケーションの大部分に大きな違いはありません。 –

    +1

    私はlinqを使ってアプリケーションを開発していますが、パフォーマンスの問題は本当に気になります。特に動的クエリのようなものを使うべきです。 – Sadegh

    1

    を参照してください、それは誤解に対して脆弱である:「私はちょうどこの抽象化を理解していれば、私は何が起こっているか理解する必要はありません。カバーの下に。"

    真実ですが、カバーの下で何が起こっているのか分かっていれば、適用が中止された箇所を理解するため、抽象的な部分からはるかに優れた価値が得られます。それが適切なところで成功の大きな自信を持っています。

    これはすべての抽象概念に当てはまりますが、Linqにはバケツが含まれています。 Linq to Objectsを理解するには、C#でSelectWhereAggregateなどをyield returnと書く方法を学ぶことが最善の方法です。 yield returnが手書きコードの多くをクラスですべて書き換えることによって、どのように置き換えられるのかを理解します。そうすれば、あなたはそれを救う努力を感謝してそれを使うことができ、もはや魔法のように見えなくなるので、あなたはその限界を理解するでしょう。

    述語が式として取り込まれ、実行される別の環境に移送されるLinqの亜種の場合と同じです。安全に使用するためには、どのように動作するのか理解しておく必要があります。

    したがって、Linqの第1の欠点は、単純な例が誤解を招くほど短く単純です。問題は、サンプルの作者が何を書くべきかを知っていたことです。彼らは長い形でそれを全部書く方法を知っていて、Linqの断片をどのようにabreviationsとして使うことができるのかを知っていたので、素敵な短いバージョンに到着しました。

    私が言っているように、実際にLinqに特有のものではありませんが、とにかく関連性は高いです。

    3

    LINQの最大の痛みは、(データベースのバックエンドで)leaky abstractionでなければリポジトリインターフェイスで使用できないということです。

    LINQは、層(特にDALなど)内幻想的ですが、別のプロバイダが異なるものをサポートしているので、あなたは、異なる実装のために同じ作業Expression<Func<...>>またはIQueryable<T>機能に頼ることはできません。例として

    、LINQ-SQL-へとEntity Frameworkの間:

    • EFはSingle()
    • あなたSkip/Take/First場合EFは、明示的なOrderBy
    • EFせずにエラーになりますをサポートしていません。

    などADO.NET Data ServicesのLINQプロバイダーはdiffereをサポートしていますntの組み合わせ。これにより、嘲笑や他の抽象化が危険にさらされます。

    しかし、メモリ内(LINQ-to-Objects)、または単一レイヤー/実装で...素晴らしい。

    ここでいくつかの考え:Pragmatic LINQ

    1

    匿名の種類。適切なORMはでなければなりません。常にのオブジェクトが「あなたの」タイプ(部分クラス、私のメソッドを追加する可能性、オーバーライドなど)を返します。チュートリアルやlinqを使ったさまざまな複雑なクエリの例がありますが、そのうちの誰もが 'プロパティのバッグ'を返すというメリットについては気にしません(新しい{return ... {}を返します)。私はどのように匿名型で作業し、別のクラスに再びラップするのでしょうか?