8

私が現在取り組んでいるプロジェクトには、一部のSql 2005データベースへのデータベースアクセスレイヤーとして機能するC#Comオブジェクトのリファクタリングが含まれます。

既存のコードの作成者は、文字列と多くのifステートメントを使用してすべてのSQLクエリを手動で作成し、かなり複雑なSQLステートメントを作成しました(〜10結合、> 10サブ選択、〜15-25 where条件とGroupBy)。基本テーブルは常に同じものですが、結合、条件、およびグループ化の構造は、クラス/メソッドに渡されるパラメーターのセットによって異なります。

このようにSQLクエリを作成することは機能しますが、それは明らかに非常に洗練されたソリューションではありません(そして、読み/理解して維持するのもかなり難しいです)...私は単純な「クエリビルダー」を自分で書くことができますが、私はかなり確信しています私はこの種の問題を抱えている最初の人ではないので、私の質問は次のとおりです。

  • データベースクエリをどのように構築しますか?
  • C#は動的にクエリを作成する簡単な方法を提供しますか?
4

12 に答える 12

9

C#とLinqを使用して、ユーザー入力でログエントリをフィルター処理するのと同様のことを行いました(条件付きLinqクエリを参照)。

IQueryable<Log> matches = m_Locator.Logs;

// Users filter
if (usersFilter)
    matches = matches.Where(l => l.UserName == comboBoxUsers.Text);

 // Severity filter
 if (severityFilter)
     matches = matches.Where(l => l.Severity == comboBoxSeverity.Text);

 Logs = (from log in matches
         orderby log.EventTime descending
         select log).ToList();

編集:クエリは、最後のステートメントの.ToList()まで実行されません。

于 2008-09-15T15:05:20.477 に答える
2

実行時間が本当に重要でない限り、私はビジネス ロジックをリファクタリングすることを検討します。ビジネス ロジックは (非常に頻繁に) データレイヤーや膨大な長さのストアド プロシージャに至る傾向があります。保守性、編集性、および追加性に関して、私は常に (C# プログラマーとして) コードをビジネスレイヤーに持ち上げようとしています。

他の誰かの 8000 行の SQL スクリプトを整理しようとするのは、私の好きな作業ではありません。

:)

//W

于 2008-09-15T20:18:27.790 に答える
1

LINQは進むべき道です。

于 2008-09-15T13:46:43.647 に答える
1

私はこれに遅れて来ており、賛成票を投じる機会はありませんが、考慮されていない優れた解決策があります。プロシージャ/関数とlinq-to-objectの組み合わせです。またはto-xmlまたはto-datatableだと思います。

私はこの正確な状況でこれを行ってきました.大規模な動的に構築されたクエリは、一種の印象的な成果でしたが、その複雑さは維持の悪夢をもたらしました. 後で来てそれを理解しなければならなかった貧しい樹液を助けるために、私は非常に多くの緑のコメントを持っていました. 私は古典的なASPを使用していたので、選択肢はほとんどありませんでした。

私がそれ以来行ってきたことは、関数/手順と linqの組み合わせです。多くの場合、全体の複雑さは、1 つの場所で実行しようとする複雑さよりも小さくなります。条件の一部を UDF に渡します。これにより、はるかに管理しやすくなります。これにより、管理しやすく理解しやすい結果セットが得られます。linq を使用して残りの区別を適用します。

両方の利点を利用できます。

  • サーバー上の総レコード数を可能な限り減らします。サーバー上で処理される多くのクレイジーな結合を取得します。データベースはこれが得意です。
  • Linq (オブジェクトなど) はそれほど強力ではありませんが、複雑な基準を表現するのに優れています。そのため、コードに複雑さを加える可能性のあるさまざまな区別に使用しますが、データベースの処理はそれほど優れていません。縮小され、正規化された結果セットで動作する linq は、パフォーマンスを大幅に低下させることなく複雑さを表現できます。

データベースで処理する基準とlinqで処理する基準を決定する方法は? あなたの判断を使用してください。複雑な db クエリを効率的に処理できる場合は、これを処理できます。一部は芸術、一部は科学。

于 2009-12-23T19:12:12.177 に答える
1

これは私が行う方法です:

public IQueryable<ClientEntity> GetClients(Expression<Func<ClientModel, bool>> criteria)
    {
        return (
            from model in Context.Client.AsExpandable()
            where criteria.Invoke(model)
            select new Ibfx.AppServer.Imsdb.Entities.Client.ClientEntity()
            {
                Id = model.Id,
                ClientNumber = model.ClientNumber,
                NameFirst = model.NameFirst,
                //more propertie here

            }
        );
    }

渡すExpressionパラメータは、さまざまな WHERE 句、JOINS などで作成する動的クエリになります。この Expression は実行時に呼び出され、必要なものを提供します。

これを呼び出す方法のサンプルを次に示します。

public IQueryable<ClientEntity> GetClientsWithWebAccountId(int webAccountId)
    {
        var criteria = PredicateBuilder.True<ClientModel>();
        criteria = criteria.And(c => c.ClientWebAccount.WebAccountId.Equals(webAccountId));
        return GetClients(criteria);
    }
于 2008-09-15T15:13:27.510 に答える
1

Linq to SQL と System.Linq.Dynamic を併用すると、いくつかの優れた可能性がもたらされます。

ここにいくつかのサンプル コード スニペットを投稿しました

...そしてここ: http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/717004553931?r=777003863931#777003863931

于 2008-09-16T06:32:03.230 に答える
1

私は Linq の可能性を理解していますが、Ben が提案している複雑さについて Linq クエリを実行しようとする人をまだ見たことがありません。

かなり複雑な sql ステートメント (~10 結合、>10 サブ選択、~15-25 where 条件と GroupBy)

大規模な Linq クエリの例と、その管理性に関するコメントはありますか?

于 2008-09-15T23:06:17.903 に答える
1

実行時にLINQまたはORMを介してSQLを動的に生成するのではなく、パラメーター化されたストアドプロシージャとして実装してデータベースで最適化できるかどうかを検討する価値があります。多くの場合、これによりパフォーマンスが向上します。私はそれが少し時代遅れであることを知っていますが、時にはそれが最も効果的なアプローチです.

于 2008-09-15T15:24:31.273 に答える
0

LINQまたは次のようなO/Rマッパーを検討することをお勧めします:http ://www.llblgen.com/

于 2008-09-15T13:47:02.367 に答える
0

http://sqlom.sourceforge.netをチェックしてください。まさにあなたが探しているものだと思います。

于 2011-03-09T11:55:03.107 に答える
0

http://www.blackbeltcoder.com/Articles/strings/a-sql-querybuilder-classの QueryBuilder クラスで一種の実験的な試みがあります。一見の価値があるかもしれません。

于 2011-01-28T01:45:34.677 に答える
0

C# と .NET 3.5 を使用し、MS SQL Server を追加する場合は、LINQ to SQL が最適です。その組み合わせ以外を使用している場合は、nHibernateSubsonicなどの ORM ルートをお勧めします。

于 2008-09-15T15:38:48.947 に答える