简化LINQ查询

时间:2017-09-07 12:57:26

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

我有以下查询:

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()

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

你可以试试这个linq查询

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

答案 2 :(得分:0)

我认为您需要在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