任何人都可以在此 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/

10-11 06:39