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

Converting an SQL Containing inner and Outer Joins into Linq

我需要将 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 不包含来自第一个 Join

的任何数据
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();

更新: 我的第一个 Join 子句最初给出错误 "The type of one of the expression in Join Clause is incorrect " 已解决,当我更改子句时 来自

"on new { br.Product, br.Year } equals new {pr.ProductID, pr.Year}" "on new { br.Product, br.Year } equals new {Product=pr.ProductID,Year= pr.Year}"

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

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

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();

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

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

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

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();