如何将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
相关产品推荐
相关产品推荐

