【问题标题】:Entity Framework load data with left join lambda实体框架使用左连接 lambda 加载数据
【发布时间】:2019-09-05 19:08:50
【问题描述】:

我想从特定 id 加载列表,其中包含 lambda 的详细信息。

我用下面的代码试了一下:

// Load User Visitor list
var list = await Context.UserVisitors
                        .Where(s => s.UserId.Equals(userOwner.Id))
                        .Select(s => s.UserVisitorId)
                        .ToListAsync();

foreach (var t in list) 
{
     UserOwnerVisitors.Add(await Context.User
                                        .Include(u => u.Details)
                                        .Include(u => u.Settings)
                                        .FirstAsync(u => u.Id.Equals(t)));
}

代码有效,但效率不高。如何使用 lambda 在一个请求中做到这一点?

提前致谢。

【问题讨论】:

  • 为什么有两个“等待”?你只需要一个。
  • 在第一个 await 方法中,我正在获取用户的所有 id。之后,我将设置、详细信息等用户数据加载到列表中。我想将其作为一个数据库查询和一个等待来完成。目前我使用丑陋的 foreach 来查询数据。
  • @TimoFalter 有一种方法可以删除你的 foreach ,在最后一行: ....FirstAsync(u => list.Contains(u.Id). 那会删除你的 foreach。
  • 但是,如果你真的想对数据库进行一次查询,你需要通过Linq执行一个join操作
  • @Bruno 是的,没错。我需要一个连接操作,这就是我创建这个问题的原因。我该怎么做?

标签: c# entity-framework linq asp.net-core .net-core


【解决方案1】:

我有点盲目,因为我不知道你模特的所有关系,但你可以在下面找到我认为是你的模特,如果你编辑你的问题,我也许可以给你一个准确的答案:

var UserOwnerVisitorsList = from uv in Context.UserVisitors
                            join u in Context.User
                            on uv.UserId equals u.Id
                            join det in Context.Details
                            on det.UserId equals u.Id 
                            join set in Context.Settings
                            on set.UserId equals u.UserId
                            where uv.UserId == userOwner.Id
                            select u;

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多