【问题标题】:Simplify LINQ query简化 LINQ 查询
【发布时间】:2018-02-16 05:30:57
【问题描述】:

我有以下疑问:

db.ObjectTags.Where(c => 
    c.TagID == tagID && 
    (!db.DeletedObjects.Any(d=> d.ForObjectTypeID == c.ForObjectTypeID && d.ForObjectID == c.ForObjectID)
    || !db.DeletedObjects.SingleOrDefault(d => d.ForObjectTypeID == c.ForObjectTypeID && d.ForObjectID == c.ForObjectID).Deleted)
)

它的目标是返回未处于删除状态的对象。

DeletedObjects有两种状态:

  • 记录不存在(未删除)
  • 存在具有deleted (bool) 值的记录

我需要查询记录不存在的位置,或者如果存在,deleted 的值是 false

有没有什么方法可以浓缩这个陈述,例如SingleOrDefault()

【问题讨论】:

    标签: c# asp.net linq linq-to-sql


    【解决方案1】:

    您只需要一个!db.DeletedObjects.Any(...) 而不需要SingleOrDefault

    var q = db.ObjectTags
       .Where(c=> c.TagID == tagID && !db.DeletedObjects
           .Any(d => d.Deleted && d.ForObjectTypeID == c.ForObjectTypeID && d.ForObjectID == c.ForObjectID));
    

    【讨论】:

      【解决方案2】:

      你能试试这个 linq 查询吗

      db.ObjectTags.Where(c => 
          c.TagID == tagID && 
          (db.DeletedObjects.Any(d=> d.ForObjectTypeID == c.ForObjectTypeID && d.ForObjectID == c.ForObjectID && !c.Deleted))
      )
      

      【讨论】:

        【解决方案3】:

        我认为您需要在ObjectTagsDeletedObjects 之间进行左连接。像这样的 LINQ 查询:

        from objectTag in db.ObjectTags
        from deletedObject in db.DeletedObjects
            .Where(deletedObject => deletedObject.ForObjectTypeID == objectTag.ForObjectTypeID && deletedObject.ForObjectID == objectTag.ForObjectID)
            .DefaultIfEmpty()
        where deletedObject == null || !deletedObject.Deleted
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-04
          • 1970-01-01
          • 1970-01-01
          • 2021-08-16
          • 1970-01-01
          • 1970-01-01
          • 2019-06-15
          • 1970-01-01
          相关资源
          最近更新 更多