任何人都可以在此 linq 语句的 where 中看到三元有什么问题:
var organizations = Context.Set<Domain.Content.Organisation>()
.Where(x => x.ShowCompanyPage == (showCompanyPagesOnly ? true : x.ShowCompanyPage))
如果 showCompanyPagesOnly 设置为 true,我会得到 4 个结果,这是正确的,只有 4 家公司的 ShowCompanyPage = true。
但是,如果我将其设置为 false,我预计会得到 1000 多个结果(所有公司)。但我仍然只得到 4。
我的逻辑不是:
if showCompanyPagesOnly is true, then give me results where x.ShowCompanyPage == true
else give me results where x.ShowCompanyPage = whatever is in the column (ie ALL Organisations)
?
x.ShowCompanyPage 是一个可为空的 bool 列。
完整代码:
public Result<IList<Organisation>> GetAllOrganisations(bool showCompanyPagesOnly = false)
{
var result = new Result<IList<Organisation>>();
try
{
var organizations = Context.Set<Domain.Content.Organisation>()
.Where(x => x.ShowCompanyPage == (showCompanyPagesOnly == true ? true : x.ShowCompanyPage)) // show only company pages or show all
.AsNoTracking()
.Select(x => new DataContracts.Content.Organisation
{
Id = x.Id,
Name = x.Name,
OrganisationTypeId = x.OrganisationTypeId,
IsCustomer = x.IsCustomer,
SeoName = x.SeoName,
Description = x.Description,
Website = x.Website
}).OrderBy(x => x.Name).ToList();
result.Data = organizations;
}
catch (Exception ex)
{
result.SetException(ex);
HandleError(ex);
}
return result;
}
最佳答案
有时,当逻辑变得太复杂时,最好的答案是将问题颠倒过来,目前您正在问
如果 showCompanyPagesOnly 为真,我如何只获得 ShowCompanyPage = true 的那些
如果你用 get 交换它,除非 showCompanyPagesOnly 为真并且你的逻辑变成一个简单的 OR 语句
showCompanyPagesOnly 不为真或 ShowCompanyPage 为真
这是
x => (!showCompanyPagesOnly) || x.ShowCompanyPage
你可能需要这样做
x => (!showCompanyPagesOnly) || (x.ShowCompanyPage ?? false)/*default value depends on if you want to treat null as true or false*/)
考虑可空性
关于c# - LINQ Where 子句中可空 bool 列的三元运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33104798/