2013-05-28 19 views
0

我想将数据库模型映射到视图模型,同时分割为未映射的属性的真正假查找:Linq IGrouping,ILookup或IDIctionary划分并映射到新的IEnumerable

对应的属性会像

public IDictionary<bool,IEnumerable<SelectListItem>> 
    NoConsentAttemptReasons { get; set; } 

,这样我可以通过

foreach (SelectListItem item in NoConsentAttemptReasons[true]) 

迭代,但我不确定的LINQ实现这一目标。试图重复排列,包括:

model.NoConsentAttemptReasons = ScreenService 
     .GetNoConsentReasons() 
     .ToLookup(r=>r.Unaware, r => new SelectListItem 
{ 
    Text = r.Description, 
    Selected = model.NoConsentAttemptId == r.Id, 
    Value = r.Id.ToString() 
}); 

,但当然我不是映射到<布尔,IEnumerable的<SelectListItem> >而是<布尔,selectListItem >

感谢您的帮助。

回答

3

我怀疑你实际上想你的财产是类型

ILookup<bool, SelectListItem> 

不要忘记,ILookup<TKey, TElement>声明为:

public interface ILookup<TKey, TElement> : IEnumerable<IGrouping<TKey, TElement>> 

(也实现非通用IEnumerable,但现在让我们忽略)

因此,查找的任何元素都已实现IEnumerable<TElement> - 你几乎可以肯定不需要在它周围增加一层IEnumerable<>

例如,如果你申报财产为:

public ILookup<bool, SelectListItem> NoConsentAttemptReasons { get; set; } 

,那么你可以这样写:

foreach (SelectListItem item in NoConsentAttemptReasons[true]) 
{ 
    ... 
} 

实现IDictionary<,>,但它实际上是简单的这方式 - 因为查找将返回一个未知密钥的空序列,而不仅仅是失败。

(在我开始回答这个问题的版本,属性是ILookup<bool,IEnumerable<SelectListItem>>类型的我不知道你为什么改变了对IDictionary<bool,IEnumerable<SelectListItem>>,但我还是想你想ILookup<bool, SelectListItem>。)

+0

谢谢你 - 你是绝对正确的我不需要额外的层 - 非常感谢你 – Brent