[英]Linq query returns a zero
我正在嘗試根據日期時間選擇器中的選定周搜索值,使用以下 Linq 查詢從數據表中搜索值。但它只返回一個 0。
選擇日期:
DateTime selecteddate = dateTimePicker1.Value.Date;
int currentDayOfWeek = (int)selecteddate.DayOfWeek;
DateTime sunday = selecteddate.AddDays(-currentDayOfWeek);
DateTime monday = sunday.AddDays(1);
if (currentDayOfWeek == 0)
{
monday = monday.AddDays(-7);
}
List<DateTime> dates = Enumerable.Range(0, 7)
.Select(days => monday.AddDays(days))
.ToList();
我的 LINQ 查詢如下。
var sumIncomes = dataTable
.AsEnumerable()
.Where(r => r["Type"]?.ToString() == "Income" &&
dates.Contains((DateTime)r["Date"]))
.Sum(rs => (decimal)rs["Amount"]);
var sumExpenses = dataTable
.AsEnumerable()
.Where(r => r["Type"]?.ToString() == "Expense" &&
dates.Contains((DateTime)r["Date"]))
.Sum(rs => (decimal)rs["Amount"]);
我的數據表是這樣的。
我不確定是什么導致了這種行為。
我創建了像你一樣的表,這就是我發現的,你的 LINQ 表達式缺少一些東西。
List<DateTime> dates = Enumerable.Range(0, 7)
.Select(days => monday.AddDays(days))
.ToList();
dates.Add(new DateTime(2021, 5, 10)); //add for simplicity to match one record from your table didn't have time to create win form project
var sumIncomes = datatable.AsEnumerable()
.Where(r => r.Field<string>("Type").Trim() == "Income" &&
dates.Contains(r.Field<DateTime>("Date")))
.Sum(r => r.Field<int>("Amount"));
正如用戶@user18387401 指出的那樣,在這種情況下,您應該使用列類型提供的字段擴展方法字符串。 如果列類型為 nvarchar(10),則當您在表中插入數據時,您將在列中像“Income”這樣的數據,而不是像這樣的“Income”,因此您總是需要從數據庫中修剪字符串值。
r.Field<string>("Type").Trim()
您在此行程序上的 Sum 方法 (decimal)rs["Amount"] 中遇到的第二個問題將引發運行時異常“Invalid cast”,因為您有 Amount 的 int 列,在這里您嘗試以十進制進行轉換,您應該提供正確的類型場法。
r.Field<int>("Amount")
希望這對您有所幫助和工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.