绑定Blazor参数的LINQ查询无返回结果问题排查
问题:LINQ根据所选餐型过滤CSV数据无返回,SelectedMeal为空
我使用LINQ查询,试图根据CSV文件(经CsvHelper处理并映射为对应模型)中的所选餐型过滤数据,但选择早餐、午餐、晚餐或零食时,查询始终无数据返回。调试发现下拉框已显示选中值,但LINQ查询中的SelectedMeal为null,导致无结果返回。选择“all-meals”时,EternityDataViewAllMeals组件可正常返回所有数据,不清楚SelectedMeal为空的原因,是否需要使用GroupBy?
相关代码
LINQ查询代码
public partial class EternityDataView : IGenerateNutritionalValues { private NutritionDataView dataView = new(); public decimal? GetCalorieValues() { var calories = from c in FileUpload.records where c.Meal == dataView.SelectedMeal select c.Calories; return calories.Sum(); } }
NutritionDataView中的餐型选择Razor代码
<div class="meal-select"> <label for="meal-select">Select meal type:</label> <select name="meal-select" id="meal-select" @bind="SelectedMeal"> <option value="all-meals">All meals</option> <option value="breakfast">Breakfast</option> <option value="dinner">Dinner</option> <option value="lunch">Lunch</option> <option value="snacks">Snacks</option> </select> </div> ....... // Switch for date range case "eternity": if (SelectedMeal == "all-meals") { <EternityDataViewAllMeals/> } else { <EternityDataView/> } break;
CSV示例数据
Date,Meal,Calories,Fat (g),Saturated Fat,Polyunsaturated Fat,Monounsaturated Fat,Trans Fat,Cholesterol,Sodium (mg),Potassium,Carbohydrates (g),Fiber,Sugar,Protein (g),Vitamin A,Vitamin C,Calcium,Iron,Note 2023-03-02,Breakfast,105.0,0.4,0.1,0.1,0.0,0.0,0.0,1.2,422.4,27.0,3.1,14.4,1.3,5.0,17.1,0.6,1.7, 2023-03-02,Lunch,710.0,30.1,3.2,0.1,0.0,0.0,0.0,2.8,214.0,91.8,9.8,44.4,18.1,0.0,15.3,1.2,1.3, 2023-03-02,Dinner,699.8,29.4,7.8,2.4,6.2,0.2,19.8,268.3,180.4,87.2,3.4,28.6,22.6,12.7,84.1,15.8,2.0, 2023-03-02,Snacks,166.0,0.4,0.0,0.1,0.1,0.0,0.0,6.9,615.7,39.6,1.0,28.7,2.4,0.0,193.7,19.4,2.5,
问题分析与解决方案
核心原因
你在EternityDataView中新建了一个独立的NutritionDataView实例(private NutritionDataView dataView = new();),但这个实例和Razor页面中绑定SelectedMeal的实例完全无关。下拉框的选中值绑定的是页面的SelectedMeal,而查询时用的是新实例的SelectedMeal,因此始终为null。此外,CSV中的餐型是大写开头(如Breakfast),下拉框的值是小写(breakfast),直接用==匹配也会导致过滤失败。
修复步骤
修改
EternityDataView,通过组件参数接收SelectedMeal:public partial class EternityDataView : IGenerateNutritionalValues { // 新增参数接收页面传递的SelectedMeal [Parameter] public string SelectedMeal { get; set; } public decimal? GetCalorieValues() { // 忽略大小写匹配CSV中的餐型 var calories = from c in FileUpload.records where c.Meal.Equals(SelectedMeal, StringComparison.OrdinalIgnoreCase) select c.Calories; return calories.Sum(); } }在Razor页面调用组件时传递
SelectedMeal参数:case "eternity": if (SelectedMeal == "all-meals") { <EternityDataViewAllMeals/> } else { <EternityDataView SelectedMeal="@SelectedMeal"/> } break;
关于GroupBy
当前问题与GroupBy无关,GroupBy用于分组统计场景,你的需求是过滤后求和,无需使用GroupBy,解决实例不统一和大小写匹配问题即可。
内容的提问来源于stack exchange,提问作者islandmonkey
相关产品推荐
相关产品推荐

