【问题标题】:how can do left join with lambda expression in c# using EF?如何使用 EF 在 c# 中使用 lambda 表达式进行左连接?
【发布时间】:2017-06-07 11:22:47
【问题描述】:

我想用 lambda 表达式进行左连接。但我不知道我该怎么做。我尝试了许多 LINQ 查询,但没有得到正确的查询。我是实体框架的新手。所以任何知道我该怎么做的人,请告诉我。

下面我尝试了这个查询:

var query = UsersContext.Users.OrderBy(a => a.Email).Skip(skip).Take(pageSize).ToList();
var result = (from u in db.Notification
              join c in query on u.id equals c.Id into j1
              from j2 in j1.DefaultIfEmpty()
              select new { u, j2 }).OrderByDescending(a => a.u.datetime).Take(3).ToList();

这是我的查询。我想让它加入通知表并只获取最后 3 个通知。

【问题讨论】:

  • EF 是一个 ORM。 LINQ 是 ORM 之上的查询语言,不是 SQL 替代品。您应该在实体上定义导航属性和关系,NOT 尝试将它们连接起来,就好像它们是表格一样。您的 User 类应该有一个 Notifications 集合属性,您可以使用它来检索通知。
  • 能否给我一个提示,我是实体框架的新手
  • UsersContextdb 是否不同 DbContexts?
  • 您无法加入您的查询,因为您使用ToList 实现了它。您不能将数据库表与内存列表连接。
  • 是的,它是不同的 DbContext,我使用了会员登录,所以 UsersContext 用于获取用户数据

标签: c# entity-framework linq


【解决方案1】:
var query = UsersContext.Users.Blah().Blah().ToList();
 // It's a non-complete List of Users....  (all we care about)

 var ids = query.Select(u=>u.Id).ToArray();
 // get an array of needed Users.

var notes = (from u in db.Notification
              where ids.Contains(u.id)
              select u).ToList(); 

var results = from u in notes
          join c in query on u.id equals c.Id into j1
          from j2 in j1.DefaultIfEmpty()
          select new { u, j2 }).OrderByDescending(a => a.u.datetime).Take(3).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 2012-09-14
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多