我是 Linq 的新手,我無法弄清楚這個查詢。
我有一個帶有欄位“RecordType”的資料表我想使用 RecordType 的第一個字母過濾某些行欄位過濾器是一個字串“A,B”應該只獲取 RecordType 以 A 或 B 開頭的記錄
我的查詢是:
string filter = "A,B";
var query = table.AsEnumerable()
.Where (row => filter.Contains(row.Field<string>("RecordType").Trim().ToUpper().First()))
.Select(s => s["FieldA"])
.Distinct()
.ToList();
我收到“System.Data.DataRowExtensions.Field(...) 回傳 null。”
我究竟做錯了什么?
以及如何在 Select 中選擇多個欄位?
uj5u.com熱心網友回復:
為了解決您收到的錯誤,我們需要明確告訴欄位呼叫回傳型別可以為 null(又名:)string?。然后,在嘗試操作字串之前,我們需要在欄位呼叫之后檢查空值。
string filter = "A,B";
var query = table.AsEnumerable()
.Where (row => filter.Contains(
// get a nullable string from Field() and then use the "" value if it is null
(row.Field<string?>("RecordType") ?? "")
// pad the string to ensure there is at least one character to get in the substring call
.PadRight(1)
// get the first character of the string and upper-case it
.Substring(0, 1).ToUpper()))
.Select(s => s["FieldA"])
.Distinct()
.ToList();
uj5u.com熱心網友回復:
.First() 將回傳第一行,而不是第一個字母。
嘗試 s.Substring(0, 1) == 'A' 檢查字串中的第一個字符是否為 A
uj5u.com熱心網友回復:
您需要過濾使用StartsWith()
var query = table.AsEnumerable()
.Where (row => row.Field<string>("RecordType").StartsWith("A", StringComparison.InvariantCultureIgnoreCase) || row.Field<string>("RecordType").StartsWith("B", StringComparison.InvariantCultureIgnoreCase)))
.Select(s => s["FieldA"])
.Distinct()
.ToList();
如果你想考慮一個過濾器變數,那么你可以將上面的查詢與Any().
由于您的filter變數由 分隔,,因此我曾經.Split(',')將字串轉換為字串陣列。
string filter = "A,B";
var query = table.AsEnumerable()
.Where (row => filter.Split(',')
.Any(x => row.Field<string>("RecordType").StartsWith(x, StringComparison.InvariantCultureIgnoreCase))
.Select(s => s["FieldA"])
.Distinct()
.ToList();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/422278.html
標籤:
