将包含内部和外部联接的SQL转换为Linq

时间:2015-09-17 19:47:35

标签: c# sql linq join linq-to-sql

我需要将SQL查询转换为Linq / Lambda表达式,我正在尝试做同样但没有得到所需的结果。

SQL:

 SELECT b.*, n.notes 
 FROM Goal_Allocation_Branch as b 
 INNER JOIN Goal_Allocation_Product as g 
      on b.Product = g.ProductID 
     and b.Year = g.Year 
 left join Goal_Allocation_Branch_Notes as n 
      on b.branchnumber = n.branch 
     and n.year = ddlYear
 WHERE b.Year = ddlYear 
   and g.Show = 1 
   and branchnumber = ddlBranch

我是Linq的新手,我在Join Clause上收到错误,X没有包含第一次加入的任何数据

var result = (from br in _DB_Branches.Goal_Allocation_Branches
                          join pr in _DB_Product.Goal_Allocation_Products on  new { br.Product, br.Year } equals new {Product= pr.ProductID, Year= pr.Year }
                          join n in _DB_Notes.Goal_Allocation_Branch_Notes.Where(n => n.Year == ddlYear) on br.BranchNumber equals n.Branch into Notes
                          from x in Notes.DefaultIfEmpty()
                          select new BranchNotesViewModel
                          {
                              Year = x.Year,
                              BranchNumber = x.Branch,
                              ProductID = x.ProdID
                          }
                          ).ToList();

更新: My First Join子句最初给出错误“Join子句中某个表达式的类型不正确”已解决,当我更改了子句时 来自

“on new {br.Product,br.Year}等于new {pr.ProductID,pr.Year}” “on new {br.Product,br.Year}等于new {Product = pr.ProductID,Year = pr.Year}”

仍未获得上述SQL查询所期望的预期结果。请指教..

2 个答案:

答案 0 :(得分:0)

它应该是这样的(见注释):

var result = 
 (from br in _DB_Branches.Goal_Allocation_Branches
  join pr in _DB_Product.Goal_Allocation_Products
    on br.Product equals pr.ProductID
  from n in _DB_Notes.Goal_Allocation_Branch_Notes.Where(x=>
    x.branch == br.branchnumber
    && x.year == ddlYear
  ).DefaultIfEmpty()
  where
    br.Year == ddlYear 
    && and br.Year == pr.Year 
    && pr.Show == 1
    && br.branchnumber == ddlBranch
  select new BranchNotesViewModel
  {
    Year = ...,
    BranchNumber = ...,
    ProductID = ...
  }
 ).ToList();

注意:将选择更改为您想要的属性。

编辑:修正了一些语法错误。

答案 1 :(得分:0)

我终于找到了正确的答案。工作得很好

var result = (from br in _DB_Branches.Goal_Allocation_Branches
                          join pr in _DB_Product.Goal_Allocation_Products on new { br.Product, br.Year } equals new { Product = pr.ProductID, Year = pr.Year }
                          join n in _DB_Notes.Goal_Allocation_Branch_Notes.Where(n=>n.Year==ddlYear) on br.BranchNumber equals n.Branch into Notes
                          where br.Year==ddlYear 
                          && pr.Show== true
                          && br.BranchNumber==ddlBranch 
                          from x in Notes.DefaultIfEmpty()
                          select new BranchNotesViewModel
                          {
                             Year=x.Year,
                              BranchNumber=x.Branch,
                              ProductID=br.Product,
                              Notes = x.Notes, 
                             //All other fields needed
                           }
                          ).ToList();