LINQ选择列表中的列表

时间:2015-04-18 14:53:25

标签: c# linq list

我尝试使用LINQ填充列表中的列表来查询我的数据库。

我面临的问题是,我不确定如何将数据选入子列表。

尝试执行以下代码时,收到错误

  

错误1无法隐式转换类型System.Linq.IQueryable'到' System.Collections.Generic.IEnumerable'。存在显式转换(您是否错过了演员?)

模型类是这样的:

public class _LayoutViewModel
{
    public List<CallGuideMenuL1> CGL1 { get; set; }
}

public class CallGuideMenuL1
{
    public string Area { get; set; }
    public List<CallGuideMenuL2> Products { get; set; }
}

public class CallGuideMenuL2
{
    public int CallGuideProductId { get; set; }
    public string Product { get; set; }
}

和DB上下文:

public class CallGuideArea
{
    public int CallGuideAreaId { get; set; }
    public string Area { get; set; }
    public List<CallGuideProduct> CallGuideProducts { get; set; }
}

public class CallGuideProduct
{
    public int CallGuideProductId { get; set; }
    public string Product { get; set; }
    public int CallGuideAreaId { get; set; }
    public DateTime Added { get; set; }
    public DateTime? Deleted { get; set; }
}

在我的控制器中,我试图选择这样的数据:

_LayoutViewModel vm = new _LayoutViewModel();

vm.CGL1 = from a in db.CallGuideArea
            .SelectMany(p => p.CallGuideProducts)
            select a;

我非常确定select a;行是问题因为我需要将数据分配回CallGuideMenuL1和{{的属性1}}。

有人能指出我正确的LINQ表达方向吗?

2 个答案:

答案 0 :(得分:3)

vm.CGL1 = db.CallGuideArea.Select(
                    a =>
                        new CallGuideMenuL1
                        {
                            Area = a.Area,
                            Products = a.CallGuideProducts.Select(p => new CallGuideMenuL2{CallGuideProductId=p.CallGuideProductId,Product=p.Product}).ToList()
                        }).ToList();

答案 1 :(得分:0)

可能vm.CGL1被声明为List,因此您需要选择List

vm.CGL1 = (from a in db.CallGuideArea
            .SelectMany(p => p.CallGuideProducts)
            select a).ToList();

或者你需要投射:

vm.CGL1 = (from a in db.CallGuideArea
            .SelectMany(p => p.CallGuideProducts)
            select new CallGuideMenuL1()
            {
               Area = a.--some property
               ...
            }).ToList();