开发者社区 问答 正文

C#在与类相关的数据存在时选择

我有一个“状态”表和相关的“状态”表。“状态”可以有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();

展开
收起
被纵养的懒猫 2019-09-27 19:39:05 433 分享 版权
阿里云 AI 助理回答

看起来你正在使用LINQ查询来从数据库中获取与状态相关的记录,并且如果存在关联的状态,你还想包含这些状态的详细信息。你的代码片段展示了如何在C#中使用LINQ表达式来处理这种一对多的关系,并构造一个新的对象集合返回。

这里有几个点需要注意和优化:

  1. 延迟加载 vs. 预加载:

    • 如果getStates()方法是从数据库(如EF Core)获取数据,确保你已经考虑了数据加载策略。对于一对多关系,预加载(.Include(st => st.Status))可以减少查询次数,提高效率,而不是让每个状态记录去懒加载其关联状态,这可能会导致N+1查询问题。
  2. 简化表达式:

    • 你的代码已经很清晰地表达了意图,但可以通过方法链进一步简化,同时利用.NET的null-conditional运算符(?.)来减少条件判断的复杂度。
  3. 预加载关联数据:

    • 在查询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或其他)和业务逻辑调整上述建议。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
C#
问答标签:
问答地址: