使用 ef core 3.1 翻译创建的用户名的最佳方式是什么

What the best way of translating created user name with ef core 3.1

public class Entity
{
    public string Id { get; set; }
    public string CreatedBy { get; set; }
    public string LastUpdatedBy { get; set; }
    [NotMapped]
    public string Creator { get; set; }
    [NotMapped]
    public string Updater { get; set; }
}

public class User
{
    public string Name { get; set; }
    public string Id { get; set; }
}

我要搜索实体,使用 ef 核心查询对 Creator/Updater 属性(和 return UserInfo.Name)进行排序,知道吗?

经过数小时的研究,参考

How do you perform a left outer join using linq extension methods

Entity Framework Join 3 Tables

oder有3种方式(个人更喜欢第一种而不是第二种):

class Program
{
    static void Main()
    {
        using TenantDBContext dbContext = new TenantDBContext("PORT=5432;DATABASE=linqtosql;HOST=xxx.com;PASSWORD=xxx;USER ID=postgres;Pooling=true;Minimum Pool Size=10;Application Name=xxx");

        var result = (
            from entity in dbContext.Entities
            join user in dbContext.Users on entity.CreatedBy equals user.Id into temp1
            from ce in temp1.DefaultIfEmpty()
            join user1 in dbContext.Users on entity.UpdatedBy equals user1.Id into temp2
            from cu in temp2.DefaultIfEmpty()
            select new Entity() { Id = entity.Id, CreatedBy = entity.CreatedBy, UpdatedBy = entity.UpdatedBy, Creator = ce.Name, Updater = ce.Name }
            ).ToList();

        Console.WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));

        var result2 = dbContext.Entities
            .GroupJoin(dbContext.Users, e => e.CreatedBy, u => u.Id, (e, u) => new { Entity = e, User = u })
            .SelectMany(eUser => eUser.User.DefaultIfEmpty(), (e, u) => new Entity() { Id = e.Entity.Id, CreatedBy = e.Entity.CreatedBy, UpdatedBy = e.Entity.UpdatedBy, Creator = u.Name })
            .GroupJoin(dbContext.Users, e => e.UpdatedBy, u => u.Id, (e, u) => new { Entity = e, User = u })
            .SelectMany(eUser => eUser.User.DefaultIfEmpty(), (e, u) => new Entity() { Id = e.Entity.Id, CreatedBy = e.Entity.CreatedBy, UpdatedBy = e.Entity.UpdatedBy, Creator = e.Entity.Creator, Updater = u.Name }
            ).ToList();

        Console.WriteLine(JsonConvert.SerializeObject(result2, Formatting.Indented));

        var result3 = dbContext.Entities
            .SelectMany(entity => dbContext.Users.Where(user => entity.CreatedBy == user.Id).DefaultIfEmpty(), (entity, user) => new { Entity = entity, User = user })
            .SelectMany(entity => dbContext.Users.Where(user => entity.Entity.UpdatedBy == user.Id).DefaultIfEmpty(), (entity, user) => new Entity { Id = entity.Entity.Id, CreatedBy = entity.Entity.CreatedBy, UpdatedBy = entity.Entity.UpdatedBy, Creator = entity.User.Name, Updater = user.Name })
            .ToList();

        Console.WriteLine(JsonConvert.SerializeObject(result2, Formatting.Indented));
    }
}