由linq语句嵌套的选择组

时间:2013-12-30 19:44:02

标签: asp.net-mvc linq join nested linq-group

我花了几天(可能是几周)试图解决这个问题。我有两个表,我试图将我的数据组织到以下层次结构中。以下是这个例子:

<ul><strong>PageTitle</strong>

<li>Category A</li>
<li>Category B</li>
<li>Category C</li>

我的查询在LinQPad中成功运行,但我无法在MVC中运行。这是我在MVC中使用的代码。

public IEnumerable<wl> List()
{
    IEnumerable<wl> wlTest;
    using (LibEntities _libEntity = new LibEntities())  {  
             wlTest = (from p in table1
                       join c in table2 on p.PK equals c.FK
                       group p by new { c.title } into g
                       select new wl
                        {
                          TitleName = g.Key.title,
                          Category = from p in g
                                     group p by g.cat_id into d
                                     select new wl{d.Key.cat_id}
                      }).ToList();

            return wlTest;

    }
}

这是wl类信息:

public class wl
{
    public string TitleName { get; set; }
    public string Category { get; set; }
}

我一直在

  

无法使用集合初始值设定项初始化类型“LibraryProject.Model.wl”,因为它未实现“System.Collections.IEnumerable”。

好的,这是LinqPad中一个非常相似的查询。

from f_a_p in Find_article_progs
join f_a in Find_articles on f_a_p.Prog_num equals f_a.DbProg 
where f_a_p.Parent_id == 183
group f_a by new {f_a_p.Prog_title} into d
select new {
    d.Key.Prog_title, 
    Links = from f_a in d
            group f_a by new {f_a.DbTitle} into c
            select new {
                c.Key.DbTitle
            }
}

任何人都可以帮我吗?

2 个答案:

答案 0 :(得分:1)

这是问题所在:

select new wl{d.Key.cat_id}

目前还不清楚你实际打算在这里做什么(无意义的类型名称​​真的没有帮助),但你可能需要这样的东西:

select new wl { CategoryId = d.Key.cat_id }

现在它是一个对象初始化器而不是集合初始化器。

您似乎不太可能实际想要new wl,请注意,您已经创建了wl。同样,除非您的Category属性实际上是一个集合,否则您可能希望从该组中获取单个条目,而不是查询所有结果。

如果您可以改进命名并提供有关您尝试执行的操作(以及数据层次结构)的更多详细信息,我们可能会为您提供更多帮助。

(顺便说一下,你给出的查询也不会使用LINQPad ......)

答案 1 :(得分:0)

此处不要输入g.Key.title_name,因为g.Key 已经您的标题名称

TitleName = g.Key.title_name  // wrong
TitleName = g.Key // correct

在选择类别时,我认为你想做这样的事情:

Categories = (from c in g 
               where c.TitleName == g.Key 
                 select c).ToList();

我对你的实体了解不多,而且你的班级名字正在扼杀我。因此,除非您向我提供有关您实体的更多信息,否则我无法提供更多建议。

相关问题