C# LINQ:WHERE子句中的IF条件不起作用

C# LINQ:WHERE子句中的IF条件不起作用,c#,mysql,sql,linq,C#,Mysql,Sql,Linq,我有以下LINQ查询,它应该查找表产品并返回传递参数的记录,这些参数是:一个搜索项(字符串)和3个不同“类型”的布尔值 问题:问题是查询总是通过查看传递的searchTerm返回记录,但它没有考虑布尔参数。因此,假设我的搜索参数是:searchTerm=“reference”,isTypeA=false,isTypeB=false和isTypeC=true。上面的查询将返回所有不同类型的带有searchTerm“reference”的记录,而不仅仅是TypeC 在发布这个问题之前,我在谷歌上搜索

我有以下LINQ查询,它应该查找表产品并返回传递参数的记录,这些参数是:一个搜索项(字符串)和3个不同“类型”的布尔值

问题:问题是查询总是通过查看传递的searchTerm返回记录,但它没有考虑布尔参数。因此,假设我的搜索参数是:searchTerm=“reference”,isTypeA=false,isTypeB=false和isTypeC=true。上面的查询将返回所有不同类型的带有searchTerm“reference”的记录,而不仅仅是TypeC

在发布这个问题之前,我在谷歌上搜索了很多,但没有什么是我遇到的。请让我知道我做错了什么。 谢谢

试试这个

   var query = context.Products
                   .Where(a => request.SearchTerm == null || a.Name.Contains(request.SearchTerm))
.Where(a => (a.OrderType == "X" && request.isTypeA)
|| (a.OrderType == "R" && request.typeB)
|| (a.OrderType == "D" && request.typeC))
.Where (a=> a.OrderType != "U")
.Where(a => a.IsInactiveFlag == false )
.OrderBy(a => a.OrderType)
.Select(c => new ProductType   
    {
        ProductTypeId = c.ProductTypeId,
        IsSelected = false,
        OrderType = c.OrderType,
        Name = c.Name,
        IsInactiveFlag = c.IsInactiveFlag
    });
试试这个

   var query = context.Products
                   .Where(a => request.SearchTerm == null || a.Name.Contains(request.SearchTerm))
.Where(a => (a.OrderType == "X" && request.isTypeA)
|| (a.OrderType == "R" && request.typeB)
|| (a.OrderType == "D" && request.typeC))
.Where (a=> a.OrderType != "U")
.Where(a => a.IsInactiveFlag == false )
.OrderBy(a => a.OrderType)
.Select(c => new ProductType   
    {
        ProductTypeId = c.ProductTypeId,
        IsSelected = false,
        OrderType = c.OrderType,
        Name = c.Name,
        IsInactiveFlag = c.IsInactiveFlag
    });

您应该明确每个过滤器值测试旁边的OrderType的包含/排除的二进制标准,该值用作开关

  var query = context.Products
                       .Where(a => request.SearchTerm == null || a.Name.Contains(request.SearchTerm))
    .Where(a => (request.isTypeA == false && a.OrderType != "X" ) || (a.OrderType == "X" && request.isTypeA == true)) ||
    (request.typeB == false && a.OrderType != "R" )|| (a.OrderType == "R" && request.typeB == true))
    || (request.typeC == false && a.OrderType != "D" ) || (a.OrderType == "D" && request.typeC == true)))
    .Where (a=> a.OrderType != "U")
    .Where(a => a.IsInactiveFlag == false )
    .OrderBy(a => a.OrderType)
    .Select(c => new ProductType   
        {
            ProductTypeId = c.ProductTypeId,
            IsSelected = false,
            OrderType = c.OrderType,
            Name = c.Name,
            IsInactiveFlag = c.IsInactiveFlag
        });

您应该明确每个过滤器值测试旁边的OrderType的包含/排除的二进制标准,该值用作开关

  var query = context.Products
                       .Where(a => request.SearchTerm == null || a.Name.Contains(request.SearchTerm))
    .Where(a => (request.isTypeA == false && a.OrderType != "X" ) || (a.OrderType == "X" && request.isTypeA == true)) ||
    (request.typeB == false && a.OrderType != "R" )|| (a.OrderType == "R" && request.typeB == true))
    || (request.typeC == false && a.OrderType != "D" ) || (a.OrderType == "D" && request.typeC == true)))
    .Where (a=> a.OrderType != "U")
    .Where(a => a.IsInactiveFlag == false )
    .OrderBy(a => a.OrderType)
    .Select(c => new ProductType   
        {
            ProductTypeId = c.ProductTypeId,
            IsSelected = false,
            OrderType = c.OrderType,
            Name = c.Name,
            IsInactiveFlag = c.IsInactiveFlag
        });

你在所有条件下都在执行OR(| |),因此括号是无用的,如果只满足一个条件(request.isTypeX==false),这将给出一个true并验证该条件。好的,我尝试了你的建议,但它仍然返回不同“类型”的所有记录,那么你有什么建议,我应该如何重写此查询,使其不会返回所有记录@yeskaThat工作完美!我不确定我的原始查询出了什么问题。您想按IsTypeC=true进行筛选。假设它为false,您的条件将返回true,因为您在IdTypeC=false上执行or运算符,并且当您正在执行的括号内外都有相同类型的运算符或(| |)在您的所有条件下,如果只满足一个条件(request.isTypeX==false),则括号无效,这将给出一个true并验证条件。好的,我尝试了你的建议,但它仍然返回不同“类型”的所有记录,那么你的建议是什么,我应该如何重写此查询,使其不返回所有记录@yeskaThat工作完美!我不确定我的原始查询出了什么问题。您想按IsTypeC=true进行筛选。假设它为false,您的条件将返回true,因为您在IdTypeC=false上执行or运算符,并且当括号内外都有相同类型的运算符时,括号是无用的