我有以下 SQL Query ,由于某些限制,因為此查詢中有更多條件,我必須將此查詢轉換為 LINQ。
SELECT
sh.BarCode
FROM
Bars AS sh
INNER JOIN BarDetail AS detail ON
detail.BarCode = sh.BarCode
AND
detail.IsActive = 1
INNER JOIN BarStatus AS st ON
st.BarCode = sh.BarCode
AND
st.IsActive = 1
所以到目前為止我在 LINQ 已經做到了這一點
var queryAble = _context.BarDetail
.Include(x => x.Bar)
.Include(x => x.Bar)
.ThenInclude(y => y.BarStatus)
.Where(x => x.IsActive == true)
.AsQueryable();
我也想申請條件barstatus;條件是barstatus與IsActive == true。我做不到。
我不想用原始 SQL 來做DbCommand,我想完全只使用 Linq-to-Entities 來做。
我怎么會這樣做,也許這樣但它不起作用
var queryAble = _context.BarDetail
.Include(x => x.Bar)
.Include(x => x.Bar)
.ThenInclude(y => y.BarStatus)
.Where(x => x.IsActive == true && x.Bar.BarStatus[SOMETHING HERE])
.AsQueryable();
uj5u.com熱心網友回復:
這是您的 SQL 到 LINQ 的直接翻譯。請注意,Include不是為了構建查詢而是為了加載相關資料。
var query =
from bar in _context.Bar
from detail in bar.Details
where detail.IsActive && bar.IsActive && bar.BarStatus.IsActive
select bar.BarCode;
uj5u.com熱心網友回復:
正如我在評論中所說,雖然您的原始 SQL 查詢有效JOIN,但子句最好只使用鍵(或元組)相等,而其他謂詞應該在WHERE子句中。遵循該模式不會對您的運行時查詢執行計劃造成任何更改,但我認為它與 SQL 所基于的關系演算保持一致——這也意味著您可以立即檢查 aJOIN是否正確,因為您將總是只使用主鍵和外鍵列(大概已經被索引了......對吧?)。
所以你的查詢變成:
SELECT
b.BarCode
FROM
Bars AS b
INNER JOIN BarDetail AS d ON d.BarCode = b.BarCode
INNER JOIN BarStatus AS s ON s.BarCode = b.BarCode
WHERE
d.IsActive = 1
AND
s.IsActive = 1
...這更容易轉化為 Linq-to-Entities:
還:
- 您不需要呼叫:從's
.AsQueryable()創建的所有非物化查詢都已經存在。DbContextDbSet<T>IQueryable<T> - 由于您擁有導航屬性,因此您無需手動操作
Join。
IQueryable<String> q = _context.BarCode
// .Include( b => b.BarDetail )
// .Include( b => b.BarStatus )
.Where( b =>
b.BarDetail.IsActive == true
&&
b.BarStatus.IsActive == true
)
.Select( b => b.BarCode );
List<String> list = await q.ToListAsync( cancellationToken ).ConfigureAwait(false);
更新:沒有b.BarDetail.IsActive == true
我不能直接添加
Include( b => b.BarStatus ),因為BarStatus與 沒有直接關系BarCode,它與BarDetail. 所以首先我們進入BarDetail,然后我們進入BarStatus使用BarDetail
你仍然可以做一個手冊JOIN:
IQueryable<String> q = _context.BarCode
// .Include( b => b.BarDetail )
// .Include( b => b.BarStatus )
.Join( _context.BarStatus, s => s.BarCode, b => b.BarCode, ( s, b )
=> new { BarStatus = s, BarCode = b, BarDetail = b.BarDetail } )
.Where( t =>
t.BarDetail.IsActive == true
&&
t.BarStatus.IsActive == true
)
.Select( b => b.BarCode );
List<String> list = await q.ToListAsync( cancellationToken ).ConfigureAwait(false);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/454037.html
