正在发生的事情是当值(例如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&& ....
感谢。
答案 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语句的空合并。这里的这个问题可能有你需要的答案,因为我没有准备好数据集。