4

次のようなデータベースから返される動的オブジェクトのリストがあります。

IEnumerable<dynamic> list = _repository.All(whereClause);

次に、そのリストで行う必要があるのは、配列で指定された各列名の一意の値のリストを取得することです。だから、このようなもの:

List<string> columns = new string[] {"Col1","Col1"};

foreach(string column in columns)
{ 
    //get unique value for column and add them to some collection 
    list.Select().Where(???)
}

リストは動的であるため、列名に基づいて選択する方法がわかりません。

誰でも助けてください

4

3 に答える 3

2

ヘルパー クラスを使用して名前でプロパティに動的にアクセスするのはどうですか (キャッシングを使用するように拡張できます)。

public class ObjectUtils
{
    public static object GetPropertyByName(object obj, string name)
    {
        if (obj == null)
        {
            return null;
        }
        PropertyInfo propInfo = obj.GetType().GetProperty(name);
        if (propInfo == null)
        {
            return null;
        }
        object value = propInfo.GetValue(obj, null);
        return value;
    }
}

そして、次のようにデータを取得します。

List<dynamic> list = new List<dynamic>();
list.Add(new { Col1 = "AB", Col2 = 23 });
list.Add(new { Col1 = "CD", Col2 = 23 });
list.Add(new { Col1 = "AB", Col2 = 5 });
list.Add(new { Col1 = "EF", Col2 = 9 });

string[] columns = new string[] { "Col1", "Col2" };
foreach (string column in columns)
{
    var elems = list.Select(d => ObjectUtils.GetPropertyByName(d, column)).Distinct().ToList();
    // elems will be "AB", "CD", "EF" for Col1
    //           and 23, 5, 9 for Col2
}

コンパイルされない場合は、必ず Microsoft.CSharp への参照を追加してください。

于 2012-04-12T12:29:14.693 に答える
1

詳細情報がなければ、次のようなことを試します。

List<dynamic> list = new List<dynamic>();
list.Add(new { a = "Col1", b = "b" });
list.Add(new { a = "Col2", b = "c" });
list.Add(new { a = "Col1", b = "c" });

string[] columns = new string[] { "Col1", "Col2" };

foreach (string column in columns)
{
    Console.WriteLine(column);
    //get unique value for column and add them to some collection 
    var select=list.Where((x) => { return x.a == column; }).Select(x=>x.b);
    select.ToList().ForEach((x) => { Console.WriteLine("{0}",x ); });
}
Console.Read();
于 2012-04-12T11:56:54.717 に答える
-1

できる:

foreach(string column in columns)
{ 
    list.Where(x => x == column);
    list.Distinct();
}

助けます?

ただし、 foreach ループをスキップできます。

list = list.Where(x => colums.Contains(x));

デュプレットがあります:

list = list.Distinct();
于 2012-04-12T11:42:05.183 に答える