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

如何将LINQ查询取单个元素的逻辑简化为单条语句

实现方案

方案1:基于原逻辑直接合并(加载完整实体)

利用C#空条件运算符?.+空合并运算符??即可实现单行逻辑,注意需要把await包裹的查询部分用括号括起来,避免语法优先级错误:

dto.ElementValue = (await _Entities.References
    .Where(db => db.LoadId == request.LoadId && db.ReferenceCode == "123")
    .OrderByDescending(rec => rec.Created)
    .FirstOrDefaultAsync(cancellationToken))?.Value ?? dto.ElementValue;

该写法和你原有逻辑完全等效:查询到实体就赋值Value,查询不到则保留dto.ElementValue的原始值,适合后续还需要用到查询返回实体其他字段的场景。


方案2:优化查询性能(仅加载需要的字段)

更推荐的写法,直接在LINQ中投影需要的Value字段,数据库层面仅返回该字段,不需要加载完整实体,查询和传输性能更高:

// 如果Value是引用类型,直接使用该写法
dto.ElementValue = await _Entities.References
    .Where(db => db.LoadId == request.LoadId && db.ReferenceCode == "123")
    .OrderByDescending(rec => rec.Created)
    .Select(r => r.Value)
    .FirstOrDefaultAsync(cancellationToken) ?? dto.ElementValue;

// 如果Value是不可空值类型(比如int、DateTime等),需要转成对应可空类型,避免默认值覆盖原有值
dto.ElementValue = await _Entities.References
    .Where(db => db.LoadId == request.LoadId && db.ReferenceCode == "123")
    .OrderByDescending(rec => rec.Created)
    .Select(r => (int?)r.Value) // 按Value的实际类型替换成对应可空类型即可
    .FirstOrDefaultAsync(cancellationToken) ?? dto.ElementValue;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:36:03