7

How can I use Left join in Linq that I write SQL query?

select 
    p.Name, p.Family,
    E.EmployTypecode, E.employtypeName, E.EmplytyppeTye 
from 
    personnel as p
left join 
    Employee as E on E.EmployTypecode = p.EmployTypecode 
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
ehsan ahmadi
  • 498
  • 2
  • 5
  • 7

5 Answers5

3

Use Join keyword instead of Left join and it is mandatory to use "INTO" keyword and "DefaultIfEmpty()" method as right table returns null value.

   var query = from p in personnel 
               join e in Employee on p.EmployTypecode equals e.EmployTypecode into t
               from nt in t.DefaultIfEmpty()
               orderby p.Name

    select new
    {
        p.Name, p.Family,
        EmployTypecode=(int?)nt.EmployTypecode,  // To handle null value if Employtypecode is specified as not null in Employee table.
        nt.employtypeName, nt.EmplytyppeTye
    }.ToList();
  • OP has asked for left join in your case actually it 's inner join so it will only select the matched results not extra one from personnel which is the purpose of left join.you can see https://msdn.microsoft.com/en-IN/library/bb397895.aspx – Navoneel Talukdar Jun 06 '16 at 10:54
2

Do it like this :

var query = 
from  p in personnel
join e in Employee 
    on p.EmployTypecode equals e.EmployTypecode
into temp
from j in temp.DefaultIfEmpty()
select new
{
    name = p.name,
    family = p.family,
    EmployTypecode = String.IsNullOrEmpty(j.EmployTypecode) ? "" : j.EmployTypecode,
    ......
}
Navoneel Talukdar
  • 4,393
  • 5
  • 21
  • 42
0
var q=(
              from pd in dataContext.personnel 
              join od in dataContext.Employee 
                  on pd.EmployTypecode equals od.EmployTypecode 
                  into t 
              from rt in t.DefaultIfEmpty() 
              orderby pd.EmployTypecode 
              select new 
              {  
                  EmployTypecode=(int?)rt.EmployTypecode,
                  pd.Name, 
                  pd.Family,  
                  rt.EmplytyppeTye 
              }
         ).ToList(); 
Abdullah Nehir
  • 1,027
  • 13
  • 23
Sajidur Rahman
  • 613
  • 6
  • 9
0

You can write like below in Linq both lamda and query

Using query syntax

var resultOfQuery = (from u in users
            join p in managers on u.Manager equals p.Email into ps
            from p in ps.DefaultIfEmpty()
            select new
            {
                User = u,
                Manager = p
            }).ToList();

Using Lambda

        var resultOfQUery = users.GroupJoin(managers, u => u.Manager, p => p.Email, (u, ps) => new {u, ps})
            .SelectMany(t => t.ps.DefaultIfEmpty(),
                (t, p) => new
                {
                    User = t.u,
                    Manager = p
                });
logeshpalani31
  • 1,416
  • 12
  • 33
-1

Why dont use SQL query to convert EF to LIST. In EF 6.1

write

 public class personnel
    {
        public String Name { get; set; }
        public String Family { get; set; }
        public String EmployTypecode { get; set; }
        public String employtypeName { get; set; }
        public String EmplytyppeTye { get; set; }
    }

List<personnel> personnels = dbentities.Database.SqlQuery<personnel>(@"select 
    p.Name, p.Family,
    E.EmployTypecode, E.employtypeName, E.EmplytyppeTye 
from 
    personnel as p
left join 
    Employee as E on E.EmployTypecode = p.EmployTypecode ").ToList();
Syed Mhamudul Hasan
  • 1,341
  • 2
  • 17
  • 45