2011-06-26 14 views
2

ここでは、データをレポートにポンピングするために長いクエリから生成されたリストがあります。辞書をリストに変換する

var result = 
    from.. 
    where.. 
    select new { sale.Id, Username = u.Name, Amount = p.amount}; 
output = result.Tolist(); 

しかし、私は代わりに値の自分のリストを作成することによって長いクエリを取り除きたいと思います。だから私はキーと値を格納する辞書を作成します。私がlist.Add(result);

エラーでエラーが発生しました

public static object GetSalesDataBySaleOrderID(SaleOrder sale) 
    { 
     List<KeyValuePair<string, object>> list = new List<KeyValuePair<string, object>>(); 

     for (int i = 0; i < sale.saleOrderItem.Count(); i++) 
     {    
      Dictionary<string, object> result = new Dictionary<string, object>() 
      { 
       {sale.Id.ToString(), sale.Id},     
       {"UserName", sale.User.GetSingleUserById(sale.saleOrderItem[i].UserId).Name}, 
       {"Amount", sale.saleOrderItem[i].Amount},     
      }; 

      list.Add(result); 
     } 

     return list; 
    } 

私のレポートに圧送することができるように 私の目的は、上記のクエリのように同じ出力を持つリストに戻って辞書を変換することです5引数が '1': 'System.Collections.Generic.Dictionary' から 'System.Collections.Generic.KeyValuePair'

--- EDITに変換することはできません----------- -
List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();に変更され、エラーが解決しました。変更答え、今OPの元のエラーが解決されていること:

私はまだ辞書形式で enter image description here

を値を取得していますしかし、これはリストに enter image description here

+0

私は自分の答えを変更しました。それがあなたのニーズを満たしているかどうか教えてください。 –

+0

あなたの要求は私には奇妙に見えますが、あなたの目標が何であるか分かりません。結果オブジェクトを取得し、プロパティ名から値にマップする辞書に変換しようとしていますか?この望ましい振る舞いを得るためにはるかに効率的な方法があります。実際には、[ExpandoObject](http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx)を使用することで、これがあなたの望むものならば無料で提供することができます。 –

答えて

1

オブジェクトのリストを実際に戻したいときは、キー値ペアのリストにすべてを変換するために何を達成しようとしているのかよく分かりません。指定された機能を以下のように減らすことができます:

public static object GetSalesDataBySaleOrderID(SaleOrder sale) 
{ 
    return sale.saleOrderItem 
       .Where(s => s != null) 
       .Select(s => new { 
            Id = s.Id, 
            Username = sale.User.GetSingleUserById(s.UserId).Name, 
            Amount = s.Amount 
           }) 
       .ToList(); 
} 
+0

素晴らしい作品です。どうすればnull値をすべて無視するのかアドバイスをお願いできますか?私はこれを試みました.Select(..)。DefaultIfEmpty()。Tolist()しかし、それでもオブジェクトのnullエラーでエラーをキャストします。 – VeecoTech

+1

@belinq: 'Where'節を追加し、'!= null'でフィルタリングする必要があります。私は自分の答えを更新しました。 – ChrisWue

4

編集意図した出力形式でなければなりません。

public static object GetSalesDataBySaleOrderID(SaleOrder sale) 
{ 
    List<KeyValuePair<string, object>> list = new List<KeyValuePair<string, object>>(); 
    for (int i = 0; i < sale.saleOrderItem.Count(); i++) 
    { 
     Dictionary<string, object> result = new Dictionary<string, object>() 
     { 
      {"SaleId", sale.Id}, 
      {"UserName", sale.User.GetSingleUserById(sale.saleOrderItem[i].UserId).Name}, 
      {"Amount", sale.saleOrderItem[i].Amount}, 
     }; 
     list.Add(result); 
    } 
    return list.Select (d => new { Id=(int)d["SaleId"], Username = d["UserName"], Amount = (Decimal) d["Amount"]}); 
} 

本当に、あなたはおそらくこの方法、あなたはそれがよく知られているオブジェクト(ない匿名型)を返すように/キャッシュを交換しようとしているものをリファクタリングする必要があります。それはList<Sale>または何かを返すことができます。

1

@ agent-jが正しい場合は、各辞書を保存する必要があります。あなたが代わりにキーと値のペアのリストをしたい場合しかし、あなたは使用することができます。List<KeyValuePair<string, object>>フォームに辞書を変換し

list.AddRange(dicionary.ToList()); 

。これにより、ユーザー名と金額キーが何度も複製されます。私は、辞書のアプローチはあなたが望むものだと思う、ちょうどそこにそれを投げる。

HTH。

1

何について:

var list = new List<SalesOrder>(dictionary.Values); 

か、すでに作成したリストを持っている場合:

list.AddRange(dictionary.Values); 
1

することExpandoObjectのリストを作成します。あなたは匿名のオブジェクトと同様の方法でそれらを使用することができます。ただし、変更可能であるか、辞書(インタフェース)として使用することができます。

var result = myDataContext.MyTable 
    .Where(sale => /* my conditions */) 
    .AsEnumerable() // use LINQ to objects at this point 
    .Select(sale => 
    { 
     dynamic exo = new ExpandoObject(); 
     exo.SaleId = sale.Id; 
     exo.UserName = sale.User.GetSingleUserById(sale.saleOrderItem[i].UserId).Name; 
     exo.Amount = sale.saleOrderItem[i].Amount; 
     return exo as IDictionary<string, object>; 
    }); 

IDictionary<string, object> first = result.First(); 
// access the properties as if it were a dictionary 
int saleId = (int)first["SaleId"]; // get (and cast) the SaleId property 
first["UserName"] = "Bob"; // set the UserName property 

// cast it back to dynamic to access the properties as if it were an anonymous object 
dynamic dfirst = first; 
decimal amount = dfirst.Amount; // get the Amount property (no cast necessary) 
dfirst.Amount = 3238132.12M // set the Amount property 
関連する問題