簡體   English   中英

C# 使用左和右連接創建 lambda 表達式和 3 個表

[英]C# Create lambda expression with Left and right Join with 3 tables

我目前正在為我的應用程序開發一個搜索過濾器,但我在按特定鍵過濾時遇到了問題,當我創建 lambda 表達式時,它給了我范圍內的所有值,但我不知道我還需要添加什么才能得到過濾器正確。

我有三個帶有各自外鍵的表:表 A:id_contract,表 B:id_build 和 id_contract,表 C:id_build

實體如下: 表A

    public partial class TableA
    {
        public TableA()
        {
            this.TableB = new List<TableB>();
        }
        public int id_contract { get; set; } //Primary Key
        public int id_client { get; set; } //FK another table not important for now
        public int contract_name { get; set; } //Information
   }

表B

    public partial class TableB
    {
        public int id_tableB { get; set; } //primary key (not use)
        public int id_contract { get; set; } //FK Table A
        public int id_build { get; set; } //FK Table C
            
        public virtual TableC TableC { get; set; }
        public virtual TableA TableA { get; set; }
        
    }

表 C

public partial class TableC
    {
        public TableC()
        {
            this.TableB = new List<TableB>();
        }
        public int id_build { get; set; } //Primary Key
        public string build_code { get; set; 
        public virtual List<TableB> TableB { get; set; }
    }

來自過濾器的參數作為控制器內部的 id_builds 列表,然后我使用包含檢查表是否具有相應的值。

我的 SQL 查詢如下:


    SELECT c.contract_name, b.build_value, MAX(p.update_date) AS [updt_date] 
    FROM
    (
        SELECT id_contract, MAX(id_build) AS id_build
     FROM [Table B]
        GROUP BY id_contract
    ) d
    JOIN [Table B] P ON p.id_contract = d.id_contract AND p.id_build = d.id_build
    RIGHT JOIN [Table A] c WITH(NOLOCK) ON p.id_contract = c.id_contract
    LEFT JOIN [Table C] b WITH(NOLOCK) ON p.id_build = b.id_build
    /*This where is where i filter it, and the correct value must be based from id_build as below, i commented it to test and get all values from query before.*/
    WHERE c.contract_name <> 0 AND c.id_company = 1 AND c.ativo = 1 --and b.id_build = XXX 
    GROUP BY c.contract_name, b.build_value

當我在不按 XXX 值過濾的情況下運行此查詢時,我得到了所有 750 個結果,這對任何值都是正確的,並且使用過濾器,我通過 id_build 得到 61 個結果,對應於我從過濾器中提供的任何值。

我當前在 C# 中的 lambda 表達式如下:


    results = db.TableA
           .Join(db.TableB, tbA => id_contract, tbB => id_contract, (tbA , tbB ) => new { tbA, Key = tbB.id_build})
           .Join(db.TableC, tbC => tbC.Key, FKTableB=> TableB.id_build, (tbC , FKTableB) => new {tbC, FKTableB})
           .Where(c => c.tbC.tbA.ativo == true && c.tbC.tbA.id_company == 1 && id_build.Contains(c.FKTableB.id_build))
    /*ignore this select inside content, but consider it as i need this output to be printed out.*/
           .Select(x => new
                   {
                      x.tbC.tbA.id_contract,
                      contract_name = x.tbC.tbA.contrato + " - " + 
                      x.tbC.tbA.client_name
                    }).ToList();

我不知道如何在這種狀態下復制聯接。

謝謝!

我不知道你到底想要什么,但我用 lambda 表達式實現了你的確切 sql 查詢。

請使用以下類進行查詢。 我加update_dateTableB類和build_valueTableC類。 id_companyativoTableA類。

public partial class TableA
{
   public TableA()
   {
       this.TableB = new List<TableB>();
   }
   public int id_contract { get; set; } //Primary Key
   public int id_client { get; set; } //FK another table not important for now
   public int contract_name { get; set; } //Information
   public int id_company { get; set; } //Information
   public int ativo { get; set; }
   public virtual List<TableB> TableB { get; set; }
}
public partial class TableB
{
   public int id_tableB { get; set; } //primary key (not use)
   public int id_contract { get; set; } //FK Table A
   public int id_build { get; set; } //FK Table C
   public DateTime update_date { get; set; }
   public virtual TableC TableC { get; set; }
   public virtual TableA TableA { get; set; }
}

public partial class TableC
{
   public TableC()
   {
      this.TableB = new List<TableB>();
   }
   public int id_build { get; set; } //Primary Key
   public string build_code { get; set; }
   public int build_value { get; set; }
   public virtual List<TableB> TableB { get; set; }
}

拉姆達表達式

var results = db.TableB
     .GroupBy(a => a.id_contract)
     .Select(a => new
     {
        id_contract = a.Key,
        id_build = a.Max(x => x.id_build)
     })
     .Join(db.TableB,
        a => new { a.id_contract, a.id_build },
        b => new { b.id_contract, b.id_build },
        (a, b) => new { id_contract = a.id_contract, id_build = a.id_build, tB = b }
     )
     .Join(db.TableA,
        a => a.id_contract,
        b => b.id_contract,
        (a, b) => new { id_contract = a.id_contract, id_build = a.id_build, tB = a.tB, tA = b }
     )
     .Join(db.TableC,
        a => a.id_build,
        b => b.id_build,
       (a, b) => new { id_contract = a.id_contract, id_build = a.id_build, tB = a.tB, tA = a.tA, tC = b })
     .Where(a=>a.tA.contract_name != 0 && a.tA.id_company == 1 && a.tA.ativo == 1)
     .GroupBy(a => new { a.tA.contract_name, a.tC.build_value })
     .Select(a => new
      {
         contract_name = a.Key.contract_name,
         build_value = a.Key.build_value,
         updt_date = a.Max(x => x.tB.update_date)
      }).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM