2013-10-21 87 views
0

考虑这两个表:LinQ在嵌套列表和嵌套选择

ClassID Name 
    1  C1 
    2  C2 

ClassID List<CourseSession> 
    1   [Object that has value "A"], [Object that has value "B"] 
    2   [Object that has value "B"], [Object that has value "C"] 

当我加入Linq中的这两个表,我得到:

ID Name List 
1 C1 [A, B] 
2 C2 [A, B] 

Wheras我需要将其展开:

ID Name List 
1 C1 A 
1 C1 B 
2 C2 A 
2 C2 B 

Linq code:

var classes = from row in t.AsEnumerable() 
           select new 
            { 
             ClassID = row.Field<Guid>("ClassID"), 
             ClassName = row.Field<string>("Name"), 
            }; 

    var classCourses = from row in classes.AsEnumerable() 
            select new 
            { 
             ID = row.ID, 
             CourseSessionList = GetAllCoursesByID(row.ID).AsEnumerable() 
            }; 

    //Attempt to join 
    var expandedClassCourse = from classRow in classes 
            join ccRow in classCourses 
            on classRow.ID equals ccRow.ID 
            into filteredExpandedClasses 
            select filteredExpandedClasses; 

我不知道如何做到这一点。有任何想法吗?

回答

0
(from c in classList 
join s in sessionList on c.ClassID equals s.ClassID 
select new 
{ 
    ID = c.ClassID, 
    Name = c.Name, 
    SessionList = s.SessionList 
}) 
.SelectMany(e => e.SessionList.Select(s => new 
{ 
    ID = e.ClassID, 
    Name = e.Name, 
    Session = s 
})) 
1

喜欢的东西(不知道你的模型是什么样子):

context.CouseSessions.Where(cs => /* condition goes here */) 
    .Select(cs => 
     new 
     { 
      Name = cs.Name, 
      Class = cs.Class.Name 
     }); 

context.Classes.Where(c => /* condition goes here */) 
    .SelectMany(c => c.Courses) 
    .Select(cs => 
     new 
     { 
      Name = cs.Name, 
      Class = cs.Class.Name 
     }); 
1

我创建了一个基于假设两种车型。我希望这有帮助。

class Info 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public List<string> List { get; set; } 
    } 

    class MyClass 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string s { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     var infos = new List<Info> { new Info { Id = 1, Name = "c1", List = new List<string> { "A", "B" } }, new Info { Id = 2, Name = "c2", List = new List<string> { "A", "B" } } }; 
     var myClasses = new List<MyClass>(); 
     foreach (var info in infos) 
     { 
      myClasses.AddRange(info.List.Select(a => new MyClass { Id = info.Id, Name = info.Name, s = a })); 
     } 
    }