如果给定值不为空,如何只比较2个值?

时间:2018-04-17 01:23:26

标签: c# entity-framework asp.net-web-api

正在发生的事情是当值(例如kitefiltered.MarcaId == null(用户留空)时,此查询检查值是否为null。但这不是我想要的。我只想检查if the value inserted != null (new value),如果它为null,则跳转到下一个where子句。

我认为之前检查的最佳解决方案,因为需要检查很多值。

var kitecadastrado = db.KiteCadastrados.Where(f => ((f.MarcaId == kitefiltered.MarcaId) && 
            (f.ModeloId == kitefiltered.ModeloId)&&(f.NumSerie == kitefiltered.NumSerie) &&...

编辑1: 澄清我的问题。我想如果kitefiltered.MarcaId!= null,TEST(f.MarcaId == kitefiltered.MarcaId)ELSE JUMP TO NEXT CLAUSE&& ....

感谢。

2 个答案:

答案 0 :(得分:1)

NULL合并可以在LINQ to entities / SQL中产生令人惊讶的结果。 SQL不会像C#那样处理NULL。 != NULL似乎翻译得很好。

如果我正确地关注您,主要问题是您在不想要的情况下通过NULL进行过滤。由于我提到的SQL翻译,这可能特别棘手。我建议使用PredicateBuilder使用表达式构建谓词。这适用于我的机器,但测试起来很困难,因为我的机器上没有上下文或EF设置。

您可能需要使用LINQKit中的AsExpandable(),因为您正在使用EF。

void Main()
{
    var predicate = PredicateBuilder.True<KiteCadastrado>();
    var filter = new KiteFilter();//your kitefiltered object 
    filter.MarcaId = "98272";//fill in your own values here
    filter.NumSerie = "Unit E";

    if(filter.MarcaId != null){
        predicate = predicate.And(p => p.MarcaId == filter.MarcaId);
    }
    if(filter.NumSerie != null){
        predicate = predicate.And(p => p.NumSerie == filter.NumSerie);
    }
    //fill out remaining values
    db.KiteCadastrados.AsExpandable().Where(predicate).Count();//Added AsExpandable()

}

public class KiteFilter
{
    public String MarcaId { get; set; }
    public String NumSerie { get; set; }
}

public static class PredicateBuilder
{
    public static Expression<Func<T, bool>> True<T>() { return f => true; }
    public static Expression<Func<T, bool>> False<T>() { return f => false; }

    public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
                                                        Expression<Func<T, bool>> expr2)
    {
        var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
        return Expression.Lambda<Func<T, bool>>
              (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
    }

    public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
                                                         Expression<Func<T, bool>> expr2)
    {
        var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
        return Expression.Lambda<Func<T, bool>>
              (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
    }
}

这样您就不必直接在LINQ表达式中包含NULL。而且你最终会得到一个更精简,更灵活的表达方式。

答案 1 :(得分:0)

查看Linq语句的空合并。这里的这个问题可能有你需要的答案,因为我没有准备好数据集。

This question is the question in question