5

データベース内のレコードと追加の列を表すオブジェクトを返す関数があります。このオブジェクト用に別のクラスを作成する代わりに、別の方法があるかどうか疑問に思いました。たとえば、次のようになります。

public object GetRecord(string key)
{
    var item = select new {column1, column2};

    return item;
}

public void main() 
{
    var item = GetRecord(1);

    //  I want to be able to reference column1 on item.  
    var x = item.column1;  
}
4

5 に答える 5

8

はい、他の方法もありますが(実際にはかなりの数です)、いずれも使用しないことを強くお勧めします。このケースを処理するための最良のオプションは、所有しているデータを保持する新しいカスタムタイプを作成することです。これは、これまでで最も保守しやすいオプションです。

匿名タイプは、単一のメソッドの範囲内で使用するために特別に設計されました。機能の設計と他の方法で戦っているので、それを行うのは困難です。Intellisenseを失う可能性が高く、パフォーマンスが低下する可能性が高く、コードを元に戻して維持する必要のある樹液が不足する可能性があります。何が起こっているのか、クエリを調整する方法がわかりません。

ほとんどの代替ソリューションの主な問題は、コンパイル時のチェックが失われることです。クエリがパラメータを削除したり、パラメータを追加したり、タイプを変更したりした場合、それを使用するコードは知る方法がありません。クエリを使用するコードを作成する場合、すべてのデータ、そのタイプ、変数の名前などを知る方法がありません。コンパイラができる変数名のタイプミスについて心配する必要があります。キャッチしないでください。クエリを生成するメソッドの内部動作を常に確認する必要があります。あなたはそれをブラックボックスまたは抽象化として扱う能力を失います。これは重要です。

これらのカスタムタイプを作成するのにかかる時間と労力が心配な場合は、データベーステーブルやその他のソースに基づいてそのようなクラスを生成するために設計された自動化ツールが数多くあります。

于 2012-12-28T18:06:18.867 に答える
6

.net 4.0の場合は、動的キーワードを使用します。

public dynamic GetRecord(string key)
{
   var item = select new {column1, column2};

   return item;
}
于 2012-12-28T18:04:25.327 に答える
3

また、.net 4.0 の場合は、 を使用して でTuple<object,object>参照できますitem.Item1。単に の代わりに、オブジェクトの入力を使用できますobject

public Tuple<Column1Type,Column2Type> GetRecord(string key)
{
   var item = select new Tuple<Column1Type,Column2Type>(column1, column2);

   return item;
}
于 2012-12-28T18:10:28.543 に答える
2

他の答えを補完するだけで、ジェネリックを使用してこれを行うこともできます。このようなもの:

public T GetRecord<T>(string key)
   where T : IAnyInterfaceWithProperties, new
{
   var item = select new T { PropertyOfInterface = value, Property2 = value2 };

   return item;
}
于 2012-12-28T18:07:28.370 に答える
1

このためにPOCOライブラリを使用することを検討するかもしれません-あなたが望むことを正確に行います。

あなたはあなた自身を転がすか、すでに利用可能なものを使うことができます:

http://code.google.com/p/dapper-dot-net/

コードは次のようになります。

 var result = connection.Query("select col1, col2 from table1");

 var x = result[0].col1;  

Drapperを使用すると、強力なタイプを使用することもできます。例:

 var result = connection.Query<myType>("select col1, col2 from table1");

 ' Now result is a list of myType
于 2012-12-28T18:24:00.693 に答える