私は次のクラスを持っています:
public class Item
{
public Dictionary<string, string> Data
{
get;
set;
}
}
そしてそのリスト:
List<Item> items;
SQLに似た文字列を使用して、このリストを動的にフィルタリングして並べ替える必要があります。問題は、データディクショナリで注文する必要があることです。
例: Order By Data["lastname"]
またはWhere Data["Name"].StartsWith("a")
。動的linqライブラリを使用することを考えましたが、クライアントがData []なしで記述できる方法はありますか?例えば:
Name.StartsWith("abc")
の代わりに
Data["Name"].StartsWith("abc")
?
これは、Linq動的クエリユニットとは何の関係もありません。そのユニットは、 実際のフィールド/プロパティがあり、それらの名前が実行時に与えられる場合のためのものです。つまり、次のようなクラスがあります。
public class Person
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
そして、次のようなクエリを記述できるようにしたいとします。
var sortedPeople = people.OrderBy("FirstName");
あなたはこれとは正反対のことをしようとしています-実際のプロパティを持たないクラスがあり、属性ディクショナリだけがあり、コンパイル時の安全性が必要です。あなたはそれを持つことができません。 特にディクショナリが公開されていて、だれでも直接追加/削除できる場合、アイテムがディクショナリに存在することを保証する方法はありません。
特定のクラス設計を使用する必要がある理由がある場合は 、Nickが提示したようにラッパーを作成することも考えられますが、私は気にしません- Data
ディクショナリがまだ広く開かれているため、実際にはカプセル化を提供していません。全世界。代わりに、単一の安全なゲッターメソッドまたはインデクサープロパティを提供し、そこにあると予想されるプロパティの名前を使用していくつかの定数(または列挙型)を作成します。
public class Item
{
public Dictionary<string, string> Data { get; set; }
public string GetValue(string key)
{
if (Data == null)
return null;
string result;
Data.TryGetValue(key, out result);
return result;
}
}
public class ItemKeys
{
public const string Name = "Name";
public const string Foo = "Foo";
}
等々。実際にはItemKeys
はそれほど重要ではありません。安全なGetValue
メソッドが重要です。それ以外の場合は、 Data
が割り当てられていない場合はNullReferenceException
、または1つのItem
インスタンスにもそのプロパティがない場合はKeyNotFoundException
のリスクを負うためです。ここでGetValue
メソッドを使用すると、次のいずれの場合でも成功します。
var myItems = items.OrderBy(i => i.GetValue(ItemKeys.Name));
あなたは同じ属性のための反復コードをたくさん書いている見つけた場合、 そのクラスへのショートカットのプロパティまたは拡張メソッドを追加することを心配始めます。