我有一个“状态”表和相关的“状态”表。“状态”可以有0或1个“状态”。目前我这样查询:
IQueryable statesRecords = getStates();
var result = statesRecords .Select(st => new StateModel() { HardwareId = st.HardwareId, StateId = st.StateId, Status = st.Status != null ? new StatusModel() // check whether related status exists { Comment = st.Status.Comment, TimeStamp = st.Status.TimeStamp }:null, TimeStamp = st.TimeStamp }).OrderByDescending(r => r.TimeStamp).ToList();
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
看起来你正在使用LINQ查询来从数据库中获取与状态相关的记录,并且如果存在关联的状态,你还想包含这些状态的详细信息。你的代码片段展示了如何在C#中使用LINQ表达式来处理这种一对多的关系,并构造一个新的对象集合返回。
这里有几个点需要注意和优化:
延迟加载 vs. 预加载:
getStates()
方法是从数据库(如EF Core)获取数据,确保你已经考虑了数据加载策略。对于一对多关系,预加载(.Include(st => st.Status)
)可以减少查询次数,提高效率,而不是让每个状态记录去懒加载其关联状态,这可能会导致N+1查询问题。简化表达式:
?.
)来减少条件判断的复杂度。预加载关联数据:
statesRecords
时,应该预先加载Status
,以避免后续查询中的多次往返数据库。修改后的代码示例可能如下:
var statesRecords = getStates().Include(st => st.Status); // 确保预加载Status
var result = statesRecords
.Select(st => new StateModel
{
HardwareId = st.HardwareId,
StateId = st.StateId,
Status = st.Status != null
? new StatusModel
{
Comment = st.Status.Comment,
TimeStamp = st.Status.TimeStamp
}
: null, // 这里其实可以省略,因为如果Status为null,直接赋值给Status属性也会是null
TimeStamp = st.TimeStamp
})
.OrderByDescending(r => r.TimeStamp)
.ToList();
或者,如果你的ORM支持,可以直接用null-conditional运算符简化Status部分:
var result = statesRecords
.Select(st => new StateModel
{
HardwareId = st.HardwareId,
StateId = st.StateId,
Status = st.Status?.ToStatusModel(), // 假设ToStatusModel是一个扩展方法或Status类的转换方法
TimeStamp = st.TimeStamp
})
.OrderByDescending(r => r.TimeStamp)
.ToList();
在这个版本中,假设有一个扩展方法或构造函数将Status
实体转换为StatusModel
,这样可以使代码更简洁、易读。
请根据你的实际ORM(如Entity Framework或其他)和业务逻辑调整上述建议。