2011-06-23 4 views
0

J'ai une requête linq dont j'ai besoin pour faire des jointures à gauche au lieu de jointures internes. Tous les exemples que je vois montrent seulement 1 jointure gauche, mais quand je l'ai essayé avec 2 je ne pouvais pas le faire correctement. Alors, comment cela changerait-il d'utiliser 2 jointures à gauche?left joindre 2 tables en utilisant linq

ruleSets = (from rs in db.RuleSets 
        join brs in db.BatchRuleSets on rs.ID equals brs.RuleSetID 
        join b in db.Batches on brs.BatchID equals b.id 
        where !clientId.HasValue || b.ClientID == clientId.Value 
        where !batchId.HasValue || brs.BatchID == batchId.Value 
        select new 
        { 
         rs.ID, 
         rs.Description, 
         rs.IsActive, 
         rs.CreatedDate, 
         rs.EffectiveDate, 
         rs.ExpirationDate, 
         BatchName = b.FileName, 
         b.ClientID 
        }).ToList().Select(x => new { 
         x.ID, 
         x.Description, 
         x.IsActive, 
         x.CreatedDate, 
         x.EffectiveDate, 
         x.ExpirationDate, 
         x.BatchName, 
         ClientName = GetClientName(x.ClientID)}); 
+1

Whar er Ror obtenez-vous? –

+0

Je n'obtiens pas d'erreur Je veux juste tous les enregistrements sans avoir un BatchRuleSet ou un Batch –

+1

Pourquoi sélectionnez-vous, puis appelez 'ToList()', puis sélectionnez à nouveau? Tout d'abord le 'ToList()' ne fait vraiment rien car le second select le retourne à un IEnumerable et en second lieu vous pouvez faire votre transform entière dans le premier select –

Répondre

1
ruleSets = (from rs in db.RuleSets 
       join brs in db.BatchRuleSets on rs.ID equals brs.RuleSetID into j1 

       from jbrs in j1.DefaultIfEmpty() 
       join b in db.Batches on jbrs.BatchID equals b.id into j2 

       from jb in j2.DefaultIfEmpty() 
       where !clientId.HasValue || jb.ClientID == clientId.Value 
       where !batchId.HasValue || jbrs.BatchID == batchId.Value 
       select new 
       { 
        rs.ID, 
        rs.Description, 
        rs.IsActive, 
        rs.CreatedDate, 
        rs.EffectiveDate, 
        rs.ExpirationDate, 
        BatchName = jb.FileName, 
        jb.ClientID 
       }).ToList().Select(x => new { 
        x.ID, 
        x.Description, 
        x.IsActive, 
        x.CreatedDate, 
        x.EffectiveDate, 
        x.ExpirationDate, 
        x.BatchName, 
        ClientName = GetClientName(x.ClientID)}); 
1

emploi laissé rejoindre à LINQ comme ça ....

join t in Web 
on websites.WebsiteID equals t.WebsiteID 
into wt1 
from wt in wt1.DefaultIfEmpty() 

après poids sera utilisé i où les conditions et l'instruction select ......

en utilisant cette concept, vous pouvez faire une jointure gauche requête dans LINQ .....

+0

ma question était comment voulez-vous faire 2 d'entre eux –

+0

@rushonerok, erm vous faites ci-dessus deux fois –

1
void Main() 
{ 
    var customers = new List<Customer> {new Customer() { CustomerId = 1}, new Customer() { CustomerId = 2}}; 
    var orders = new List<Order> {new Order() { OrderId = 1, CustomerId = 1}, new Order() { OrderId = 2, CustomerId = 1}}; 
    var items = new List<Item> {new Item() { ItemId = 1, OrderId = 1}, new Item() { ItemId = 2, OrderId = 1}, new Item() { ItemId = 3, OrderId = 2}}; 

    var doubleJoin = from customer in customers 
    join order in orders on customer.CustomerId equals order.CustomerId 
    into customerOrders 
    from co in customerOrders.DefaultIfEmpty() 
    where (co != null) 
    join item in items on co.OrderId equals item.OrderId 
    select new {Customer = customer, Orders = co, Items = item}; 

    doubleJoin.Dump(); 
} 

public class Customer 
{ 
    public int CustomerId { get; set; } 
} 

public class Order 
{ 
    public int OrderId { get; set; } 
    public int CustomerId { get; set;} 
} 

public class Item 
{ 
    public int ItemId { get; set; } 
    public int OrderId { get; set; } 
}