2015-02-11 50 views
0

我有以下表strutucture和我使用MySQL的实体框架访问它们:建立一个实体加盟LINQ查询

Table Users 
- Id 
- Name 

Table Subscriptions 
- Id 
- Id_User 
- Id_Course 

Table Courses 
- Id 
- Name 

我想什么,我有困难的时候这样做是建立一个链接查询对于返回包含每个条目的列表的所有用户:

  • User Id;
  • 用户名;
  • 以逗号分隔的Concat字符串,其中包含用户的所有课程,如果没有则为'no courses'字符串。

该列表应该按部分用户名过滤。

我已经开始建立的代码,但不能完成它:

var Model db = new Model(); 
var list = from user in db.Users 
      join ??? 
     where user.Name.Contains(filter.Trim()) 
     select new { Name = user.Name, Id = user.Id, ???} 

谁能帮助我吗?

回答

1

您应该使用导航属性(如User.Subscriptions)。根据你创建模型的方式,他们可能已经在那里,否则你首先应该添加它们。

var query = from u in db.Users 
      where user.Name.Contains(filter) // trim the filter value first 
      select new 
      { 
       u.Name, 
       u.Id, 
       Courses = u.Subscriptions.Select(s => s.Course.Name) 
      }; 

var result = query.AsEnumerable() 
        .Select(q => new 
          { 
           q.Name, 
           q.Id 
           Courses = string.Join(", ", q.Courses) 
          }; 

其原因在两个阶段中做这是string.Join不能直接在EF LINQ表达(不能变成SQL)中使用,因此必须在存储器(完成之后即一个AsEnumerable)。

但是仍然可以先进行投影(第一部分),否则可能会从数据库中提取太多数据。

+0

太棒了,我有一个导航和你的代码很好地工作。实体太聪明了,有时候我看不出它有多简单。谢谢! – 2015-02-12 01:39:10