我有多個從資料庫回傳的記錄,我想從每一行獲取價格。但是,我要選擇的價格取決于標志。我可以執行以下操作來恢復我想要的數字,但是我想要一種更清潔的方式。
var one = Records.Where(x => x.HasBeenSent && x.Revised != 0).Select(x => x.Revised);
var two = Records.Where(x => x.HasBeenSent && x.Revised == 0).Select(x => x.Original);
var three = Records.Where(x => !x.HasBeenSent && x.NonSentRevised != 0).Select(x => x.NonSentRevised);
var four = Records.Where(x => !x.HasBeenSent && x.NonSentRevised == 0).Select(x => x.NonSentOriginal);
uj5u.com熱心網友回復:
假設您的Revised, Original, NonSentRevised,NonSentOriginal是簡單型別并且屬于同一型別。您可以嘗試以下方法:
var prices = Records.Select(x =>
(x.HasBeenSent ?
(x.Revised != 0 ? x.Revised : x.Original)
: (x.NonSentRevised != 0 ? x.NonSentRevised
: x.NonSentOriginal )))
筆記:
再三考慮,我們不需要匿名類,因為我們只需要一個屬性
只要“價格”是簡單型別,上面的代碼就應該適用于
IQueryable實體如有疑問,請運行 SQL 分析器以查看正在生成的查詢
uj5u.com熱心網友回復:
您可以嘗試使用三元運算子重寫為單個查詢,讓您的條件Select進行判斷。
var one = Records.Where(x =>
(x.HasBeenSent && x.Revised != 0) ||
(x.HasBeenSent && x.Revised == 0) ||
(x => !x.HasBeenSent && x.NonSentRevised != 0) ||
(!x.HasBeenSent && x.NonSentRevised == 0)
).Select(x => (x.HasBeenSent && x.Revised != 0) ? x.Revised :
(x.HasBeenSent && x.Revised == 0) ? x.Original :
(x => !x.HasBeenSent && x.NonSentRevised != 0) ? x.NonSentRevised:
(!x.HasBeenSent && x.NonSentRevised == 0) x.NonSentOriginal : 0);
另一種方式,我會寫一個方法讓代碼清晰
var one = Records.Where(x =>
(x.HasBeenSent && x.Revised != 0) ||
(x.HasBeenSent && x.Revised == 0) ||
(x => !x.HasBeenSent && x.NonSentRevised != 0) ||
(!x.HasBeenSent && x.NonSentRevised == 0)
).Select(GetPrice);
decimal GetPrice(Record x){
if(HasBeenSent){
if(x.Revised != 0)
return x.Revised;
else
return x.Original;
}
if(!x.HasBeenSent){
if(x.NonSentRevised != 0)
return x.NonSentRevised;
else
return x.NonSentOriginal;
}
return 0;
}
uj5u.com熱心網友回復:
一個簡單的三元運算應該可以滿足您的需求。
var result =
from x in Records
select
x.HasBeenSent
? (x.Revised != 0 ? x.Revised : x.Original)
: (x.NonSentRevised != 0 ? x.NonSentRevised : x.NonSentOriginal);
像這樣的樣本資料
HasBeenSent Original Revised NonSentOriginal NonSentRevised
1 100 200 300 400 200
1 500 0 700 800 500
0 900 1000 1100 1200 1200
0 1300 1400 1500 0 1500
我得到以下輸出
200
500
1200
1500
** 編輯 **
LINQ to SQL生成的SQL代碼如預期高效
-- Region Parameters
DECLARE @p0 Int = 0
DECLARE @p1 Int = 0
-- EndRegion
SELECT
(CASE
WHEN [x].[HasBeenSent] = 1 THEN
(CASE
WHEN [x].[Revised] <> @p0 THEN [x].[Revised]
ELSE [x].[Original]
END)
WHEN [x].[NonSentRevised] <> @p1 THEN [x].[NonSentRevised]
ELSE [x].[NonSentOriginal]
END) AS [value]
FROM [Records] AS [x]
uj5u.com熱心網友回復:
如果您正在查詢物件(即,針對 aIEnumerable<T>而不是針對 a IQueryable<T>),您可以使用模式匹配:
var result = Records
.Select(x => (x.HasBeenSent, x.Revised, x.NonSentRevised) switch {
(true, not 0, _) => x.Revised,
(true, 0, _) => x.Original,
(false, _, not 0) => x.NonSentRevised,
(false, _, 0) => x.NonSentOriginal
});
這使用元組模式作為位置模式的特例。
也可以看看:
- 模式(C# 參考)
- 模式匹配概述
- 開關運算式(C# 參考)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/442854.html
上一篇:獲取所有別名的串列并與名稱聯合
