You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

绑定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),直接用==匹配也会导致过滤失败。

修复步骤

  1. 修改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();
        }
    }
    
  2. 在Razor页面调用组件时传递SelectedMeal参数:

    case "eternity":
        if (SelectedMeal == "all-meals")
        {
            <EternityDataViewAllMeals/>
        }
        else
        {
            <EternityDataView SelectedMeal="@SelectedMeal"/>
        }
        break;
    

关于GroupBy

当前问题与GroupBy无关,GroupBy用于分组统计场景,你的需求是过滤后求和,无需使用GroupBy,解决实例不统一和大小写匹配问题即可。


内容的提问来源于stack exchange,提问作者islandmonkey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:54:51