将IQueryable <t>与LINQ连接表一起使用

时间:2017-09-18 21:53:23

标签: asp.net-mvc linq iqueryable

我有IQueryable<T>类型的方法,这是它的实现:

 public IQueryable<T> Get()
 {
     return db.Set<T>();
 }

我必须编写LINQ查询,我想连接两个表(左连接)。它是Identtiy表用户和我的自定义表PersonalInformation,它扩展了用户注册字段,现在我想在我的LINQ查询中调用这个方法,这很好。这是我的Linq:

IRepository<PersonalInformation> personRepository;
IRepository<ApplicationUser> usersRepository;
var query = personRepository.Get();
var test = usersRepository.Get()
                          .GroupJoin(query,
                                     n => n.Id,
                                     m => m.UserId,
                                     (n, ms) => new { n, ms = ms.DefaultIfEmpty() })
                          .SelectMany(z => z.ms.Select(m => new PersonalInfoModel
                          {
                              Name = m.Name,
                              LastName = m.LastName,
                              Email = z.n.Email
                          }));

但我有错误 var test = usersRepository.Get() - System.NotSupportedException。所以方法get从personRepository调用good,但usersRepository方法返回null。我在哪里做错了?感谢

1 个答案:

答案 0 :(得分:0)

您可能在组合来自两个不同数据库上下文的查询时出错。您的自定义PersonalInformation可能位于自定义DBContext中,而Users位于IdentityDBContext中。见this related question。你可以:

将所有表格移至相同的上下文中。

  • 避免将来混淆这些表格
  • 如果您在各种情境中最终都有很多关联,效率会更高。
  • 一个更为复杂的解决方案,只是为了让这个例子有效。

分别查询表并在内存中合并。

  • 如果您拥有大量用户,则可扩展性较低。
  • These operators will cause EF to return the results so you can process in memory.

    var people = personRepository.Get().ToList();
    var users = usersRepository.Get().ToList();
    var infoModels = users.GroupJoin(people,
                                     u => u.Id,
                                     p => p.UserId,
                                     (u, mp) => new { n, ms = ms.DefaultIfEmpty() })
                          .SelectMany(z => z.ms.Select(m => new PersonalInfoModel
                          {
                              Name = m.Name,
                              LastName = m.LastName,
                              Email = z.n.Email
                          }));