我有以下Lambda表达式,它返回一个结果属性数组:
ViewBag.Items = db.Items.Select(m => new { m.Id, m.Column1, m.Column2 }).ToArray();
这可以按预期工作,但我需要将结果作为key =>值对,其中Id是Column1&的关键字。 Column2是值。我找到了关于如何创建Dictionary的示例,但没有找到仅在结果中隔离特定列的示例。
ViewBag.Items
在视图中使用:
var _items = @Html.Raw(Json.Encode(ViewBag.Items));
如何更改上面的Lambda以生成一组key =>值对?
答案 0 :(得分:8)
您可以使用ToDictionary
执行此操作:
db.Items.Select(m => new { m.Id, m.Column1, m.Column2 })
.ToDictionary(x=>x.Id, x=>new {x.Column1, x.Column2});
如果您希望将Id作为值来考虑HimBromBeere的良好解决方案,那么Dictionary
为Id
为关键,{Column1, Column2}
为值。
答案 1 :(得分:6)
问题出在哪里?
ViewBag.Items = db.Items.Select(m => new KeyValuePair<string, MyType>
(
m.Id,
new MyType { Column1 = m.Column1, Column2 = m.Column2 }
)).ToArray();
但无论如何Dictionary
只是KeyValuePair
的列表,为什么不使用呢?
ViewBag.Items = db.Items.ToDictionary(
m => m.Id,
m => new MyType { Column1 = m.Column1, Column2 = m.Column2 });
当然您也可以使用Dictionary<anonymous, anonymous>
:
ViewBag.Items = db.Items.ToDictionary(
m => m.Id,
m=> new { m.Column1, m.Column2 } );
但是当你将它分配给一个视图时,我怀疑你可以在这里使用匿名类型。
在Dictionary
数组上使用KeyValuePair
的优点是还会检查重复的键。如果你想避免这种情况,请改用ToLookup
来代替重复键。