2012-10-17 39 views
3

我的模型:如何在EF中指定左連接?

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依舊排出內部聯接sql代碼,有什麼錯?

回答

6

左外連接例子:

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]  
5

您應該使用GroupJoin

看一看的例子

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

位simplier春豪唐的回答版本:

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