【发布时间】:2023-03-31 12:01:02
【问题描述】:
我有这个查询来获取文章列表。如果一篇文章IsLocked,它应该只包含在列表中,如果它是由登录的管理员用户创建的:
List<Article> articles = await db
.Articles
.Where(a => a.IsLocked
? a.CreatedBy.Id == LoggedInAdminUserId
: true)
.ToListAsync();
但就像现在一样,任何登录的管理员用户都可以看到所有锁定的文章,无论它们是谁创建的。
我应该如何修改我的查询?
** 编辑 **
上面的查询是一个缩短的版本。这是完整的查询:
List<Article> dbm = await db.Articles
.Where(s =>
(!s.IsLocked || s.CreatedBy.Id == LoggedInAdminUserId) &&
s.Title.Contains(search) ||
s.PreTitle.Contains(search) ||
s.Preamble.Contains(search) ||
s.MainText.Contains(search) ||
s.CreatedBy.Member.FirstName.Contains(search) ||
s.CreatedBy.Member.LastName.Contains(search) ||
s.EditedBy.Member.FirstName.Contains(search) ||
s.EditedBy.Member.LastName.Contains(search) ||
s.FrontPageItem.PublishedBy.Member.FirstName.Contains(search) ||
s.FrontPageItem.PublishedBy.Member.LastName.Contains(search)
)
.Include(f => f.FrontPageItem)
.Include(e => e.CreatedBy)
.ThenInclude(m => m.Member)
.Include(e => e.EditedBy)
.ThenInclude(m => m.Member)
.Include(p => p.PublishReadyBy)
.ThenInclude(m => m.Member)
.Include(o => o.ArticleOperations)
.OrderByDescending(s => s.DateCreated)
.ToListAsync();
编辑 2
好的,所以我想已经很晚了,而且我的眼睛真的眯着。在所有 .Contains() 周围添加一组 () 就可以了:
.Where(s =>
(!s.IsLocked || s.CreatedBy.MemberId == AdminUserMemberId) &&
(s.Title.Contains(search) ||
s.PreTitle.Contains(search) ||
s.Preamble.Contains(search) ||
s.MainText.Contains(search) ||
s.CreatedBy.Member.FirstName.Contains(search) ||
s.CreatedBy.Member.LastName.Contains(search) ||
s.EditedBy.Member.FirstName.Contains(search) ||
s.EditedBy.Member.LastName.Contains(search) ||
s.FrontPageItem.PublishedBy.Member.FirstName.Contains(search) ||
s.FrontPageItem.PublishedBy.Member.LastName.Contains(search))
)
【问题讨论】:
-
您可以使用
!a.IsLocked || a.CreatedBy.Id == LoggedInAdminUserId简化三元的布尔表达式,但您的逻辑看起来是正确的。我假设每个管理员用户对LoggedInAdminUserId有不同的值? -
我强烈推荐使用 AND 和 OR 来组合表达式,而不是使用条件表达式。阅读
!a.IsLocked || a.CreatedBy.ID == LoggedInAdminUserId比你所拥有的更具可读性,即使它们在语义上是相同的。 -
Id和LoggedInAdminUserId属性的类型是什么? -
@JonathonChase 我尝试用
!s.IsLocked || s.CreatedBy.Id == LoggedInAdminUserId替换表达式,但结果是一样的。是的,每个管理员用户都有一个唯一的LoggedInAdminUserId。 -
@DervişKayımbaşıoğlu
CreatedBy.MemberId是int和LoggedInAdminUserId是int?。但即使我投到int,我也会得到相同的结果。
标签: c# linq asp.net-core