[英]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_date
到TableB
類和build_value
到TableC
類。 和id_company
和ativo
到TableA
類。
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.