Expression<Func<TObject, bool>>与Func<TObject, bool>的区别

Func<TObject, bool>是委托(delegate)

Expression<Func<TObject, bool>>是表达式

Expression编译后就会变成delegate,才能运行。比如

Expression<Func<int, bool>> ex = x=>x < 100;

Func<int, bool> func = ex.Compile();

然后你就可以调用func:

func(5) //-返回 true

func(200) //- 返回 false

而表达式是不能直接调用的。

===========================

案例:不正确的查询代码造成的数据库全表查询。


//错误的代码

Func<QuestionFeed, bool> predicate = null;

if (type == 1)

{

    predicate = f => f.FeedID == id && f.IsActive == true;

}

else

{

    predicate = f => f.FeedID == id;

}

//_questionFeedRepository.Entities的类型为IQueryable<QuestionFeed>

_questionFeedRepository.Entities.Where(predicate);

上面代码逻辑是根据条件动态生成LINQ查询条件,将Func类型的变量作为参数传给Where方法。

实际上Where要求的参数类型是:Expression<Func<TSource, bool>>。

解决方法:

不要用Func<TSource, bool>,用Expression<Func<TSource, bool>>。

//正确的代码

Expression<Func<QuestionFeed, bool>> predicate=null;

if (type == 1)

{

    predicate = f => f.FeedID == id && f.IsActive == true;

}

else

{

    predicate = f => f.FeedID == id;

}

_questionFeedRepository.Entities.Where(predicate);
时间: 2024-10-12 16:26:23

Expression<Func<TObject, bool>>与Func<TObject, bool>的区别的相关文章

lambda表达式Expression&lt;Func&lt;Person, bool&gt;&gt; 、Func&lt;Person, bool&gt;区别

前言: 自己通过lambda表达式的封装,将对应的表达式转成字符串的过程中,对lambda表达式有了新的认识 原因: 很多开发者对lambda表达式Expression<Func<Person, bool>> .Func<Person, bool>表示存在疑惑,现在就用代码举个简单列子 原代码: using System;using System.Collections.Generic;using System.Linq;using System.Linq.Expres

Expression&lt;Func&lt;T,TResult&gt;&gt;和Func&lt;T,TResult&gt; 与AOP与WCF

1>>Expression<Func<T,TResult>>和Func<T,TResult>http://www.cnblogs.com/xcsn/p/4520081.htmlhttp://www.cxyclub.cn/n/63037/http://q.cnblogs.com/q/37952/2>>AOP与WCFhttp://www.oschina.net/question/2245602_178068?sort=timehttp://www.c

从var func=function 和 function func()区别谈Javascript的预解析机制

var func=function 和 function func()在意义上没有任何不同,但其解释优先级不同:后者会先于同一语句级的其他语句. 即: { var k = xx(); function xx(){return 5;} } 不会出错,而 { var k = xx(); var xx = function(){return 5;} } 则会出错. 为什么会这样呢?这就要引出javascript中的预解析机制来解释了. JavaScript解析过程分为两个阶段,一个是编译阶段,另外一个

如何:从 bool? 安全地强制转换为 bool(C# 编程指南)

bool? 可以为 null 的类型可以包含三个不同的值:true.false 和 null.因此,bool? 类型不能用于条件语句,如 if.for 或 while.例如,此代码无法编译,并将报告编译器错误 CS0266: bool? b = null; if (b) // Error CS0266. { } 这是不允许的,因为 null 在条件上下文中的含义并不清楚.若要在条件语句中使用 bool?,请首先检查其 HasValue 属性以确保其值不是 null,然后将它强制转换为 bool.

Expression&lt;Func&lt;T,TResult&gt;&gt;和Func&lt;T,TResult&gt;

1.Expression<Func<T,TResult>>是表达式 //使用LambdaExpression构建表达式树 Expression<Func<int, int, int, int>> expr = (x, y, z) => (x + y) / z; Console.WriteLine(expr.Compile()(1, 2, 3)); https://msdn.microsoft.com/zh-cn/library/system.linq.

NSUserDefaults设置bool值重新启动后bool仅仅设置丢失问题

今天使用NSUserDefaults保存bool至重新启动后发现bool值没有保存对 NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; [ud setBool:_rememberUsernamePassword forKey:@"rememberUsernamePassword"]; 解决方法 [ud synchronize]; 设置完毕后有须要同步一下

delphi编程里的bool跟boolean类型有什么区别

bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使用Boolean类型.这四种类型的布尔值占用内存的数量如下:Boolean 1 ByteByteBool 1 ByteWordBool 2 Bytes(1 Word)LongBool 4 Bytes(2 Words)对于ByteBool,WordBool和LongBool三种类型True常量的值为非

NSUserDefaults设置bool值重启后bool只设置丢失问题

本文转载至 http://blog.csdn.net/cerastes/article/details/38036875 NSUserDefaultsbool同步synchronize无效 今天使用NSUserDefaults保存bool至重启后发现bool值没有保存对 [objc] view plaincopy NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; [ud setBool:_rememberUsernamePas

解决Html.CheckBoxFor中”无法将类型 bool 隐式转换为 bool。存在一个显式转换...&quot;的方法

在后面加.Value属性 @Html.CheckBoxFor(m => m.IsComment.Value, new { style = "vertical-align: middle;" })