【问题标题】:How to specify left join in EF?如何在 EF 中指定左连接?
【发布时间】:2012-10-17 06:59:50
【问题描述】:

我的模特:

public partial class history_builds
{
    public int ID { get; set; }
    public int build { get; set; }
    public int br { get; set; }
    public int tag { get; set; }
    public string line { get; set; }
    public int rev { get; set; }
    public int user_ID { get; set; }
    public string distrib_path { get; set; }
    public string setup_path { get; set; }
    public System.DateTime build_date { get; set; }
    public string product { get; set; }
}

public partial class history_uploads
{
    public int ID { get; set; }
    public int ID_user { get; set; }
    public string Line { get; set; }
    public int Build { get; set; }
    public string Distrib { get; set; }
    public System.DateTime Time_upload { get; set; }
    public int Status { get; set; }
}

public partial class user
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int ID_group { get; set; }
}

上下文:

public DbSet<history_builds> history_builds { get; set; }
public DbSet<history_uploads> history_uploads { get; set; }
public DbSet<user> users { get; set; }

我尝试像这样Entity framework left join 进行左连接

var items = entities.history_builds
    .Join(
        entities.users.DefaultIfEmpty(),
        hb => hb.user_ID,
        u => u.ID,
        (hb, u) =>
            new {
                hb.distrib_path,
                hb.setup_path,
                hb.build_date,
                hb.build,
                User = (u == null ? String.Empty : u.Name),
                hb.rev
            }
    )
    .Join(entities.history_uploads.DefaultIfEmpty(),
        hb => hb.build,
        hu => hu.Build,
        (hb, hu) =>
            new HistoryBuidItem {
                Revision = hb.rev,
                Build = hb.build,
                DistribPath = hb.distrib_path,
                SetupPath = hb.setup_path,
                BuildDate = hb.build_date,
                User = hb.User,
                IsUpload = (hu == null ? true : false)
            }
    )
    .Where(x => ids.Contains(x.Revision))
    .ToList();

但是不行,EF还是发出inner join sql代码,怎么回事?

【问题讨论】:

    标签: c# entity-framework orm


    【解决方案1】:

    您应该为此使用GroupJoin

    看一下例子:

    var customers = db.Customer
                      .GroupJoin(db.SpecialCustomer, c => c.ID, g => g.CustomerId, (f, b) => new { f, b })
                      .SelectMany(z => z.b.DefaultIfEmpty(), (z, g) => new { z, g });
    

    【讨论】:

      【解决方案2】:

      左外连接示例:

      from c in table0
      join o in table1 on c.sno equals o.sno into ps
      from o in ps.DefaultIfEmpty()
      select new { c.name, o.number}
      

      渲染SQL:

      SELECT [t0].[name], [t1].[number] AS [number]
      FROM [table0] AS [t0]
      LEFT OUTER JOIN [table1] AS [t1] ON ([t0].[sno]) = [t1].[sno]    
      

      【讨论】:

        【解决方案3】:

        唐春浩回答的更简单的版本:

        from c in table0
        from o in table1.Where(x => c.sno == x.sno).DefaultIfEmpty()
        select new { c.name, o.number }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-12-21
          • 2018-07-09
          • 2021-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-03
          相关资源
          最近更新 更多