2

データベースから取得されるテーブル用の .net インターフェイスを作成するタスクが与えられました。

インターフェイスが実行しなければならない明白なことの 1 つは、テーブルからデータを取得することです。

Select * from MyTable;だから....単純に実行して結果を返す関数を書くことができます。ただし、テーブルには 10 個の列があり、インターフェイスを使用しているユーザーが 1 つ以上の列でデータをフィルター処理する必要がある場合があります。のようなものが必要かもしれませんSelect * from MyTable where LastName like 'A%';。テーブルからデータをダウンロードするための柔軟な単一エントリ ポイントになるようにインターフェイスを設計するにはどうすればよいですか?

サーバーからテーブル全体を取得し、結果を .net コードでフィルタリングするソリューションは、帯域幅の問題から受け入れられないと言われています。

注:また、SQL テーブルからデータを取得するコードが WCF サービスとして呼び出されることも付け加えておきます。ただし、データは取得されますが、参照としてではなく、シリアル化可能なデータとして呼び出し元に返される必要があります。

明確化:「インターフェース」とは、単に SQL テーブルからデータを取得するために呼び出される関数を意味していました。「インターフェース」という用語が少し混乱していることに気づきました。私がしていることを正確に表す言葉がありますが、それが何であるかはわかりません。

4

3 に答える 3

3

LINQ to Entitiesを使用することをお勧めします。帯域幅効率に関する懸念事項はすべて解決済みです。

更新 (WCF 用):この場合、WCF Data Services (旧称 ADO.NET Data Services、旧称 Astoria) をお勧めします。彼らは、興味深い方法で oData と呼ばれる REST プロトコルを使用しています。基本的に、IQueryable<T>(LINQ to Entities などを使用して) を提供することでサービスを実装すると、「LINQ to oData」を使用してサービスを利用できます (この用語は私が勝手に作ったものですが、これがアイデアです)。

このようにして、クライアントは次のようなことができます。

var beverages = from product in myDataService.Products
                where product.CategoryName = "Beverages"
                select product;

myDataService(がDataServiceContractWCF データ サービスを指すと仮定します)。そのクエリは、のような oData 呼び出しに変換されますhttp://myHost/myWCFService.svc/Products?$filter=CategoryName%20eq%20'Beverages'。oData クエリ文字列は、WCF データ サービスによって解釈され、実装に渡されますIQueryable<T>。これが LINQ to Entities の場合、クエリはデータベースに渡されるため、実際に実行される SQL は次のようになりSELECT * FROM [Products] WHERE [Products].[CategoryName] = 'Beverages'ます。

ご覧のとおり、これは非常に強力な概念であり、SQL インジェクションの危険なしに非常に効率的なデータ クエリを実行できます。欠点があります。あらゆる種類のクエリが許可されるため、このアプローチではデータベースの最適化がより困難になる可能性があります。また、DoS 攻撃が容易になる可能性もありますが、制限される可能性があります。そのため、プログラマーとしての生活は非常に楽になりますが、一部の DBA はそれを受け入れるのをためらっています。

于 2010-07-06T20:12:08.037 に答える
0

NHibernate、SubSonic、LINQ 2 SQL、Entity Framework、LLBLGen、Codus などがあります。

私は個人的に Fluent マッピングを備えた NHibernate が好きですが、やり過ぎと見なされる可能性があり、学習曲線が少しあります。

Sh#rp Architecture、Spring.NET、Castle Active Record などのライブラリは、NHibernate の実装の詳細を抽象化するため、DAL の維持を心配することなく Pocos とビジネスに集中できます。

于 2010-07-07T00:15:37.403 に答える
-5

フォームに 10 個のテキスト ボックスを配置し、次のようなクエリを作成します。

string query = "select top 100 * from MyTable where 1=1 ";
if (!string.IsNullOrEmpty(txtLastName.Text))
    query += string.Format("and LastName like '%{0}%' ", txtLastName.Text);
if (!string.IsNullOrEmpty(txtFirstName.Text))
    query += string.Format("and FirstName like '%{0}%' ", txtFirstName.Text);

このtop句は、これが 100 を超える行を決してダウンロードしないようにします。

権限の低いユーザーを使用して結果のクエリを実行するか、ユーザーがテキストボックスに一重引用符を入力しないようにしてください':)

于 2010-07-06T20:18:44.360 に答える