简单和复杂的lambda表达式

今天遇到一个问题,代码是这样的。

        public List<BillName> QueryBill(int[] id = null, string[] name = null)

        {

            List<BillName> queryResult = new List<BillName>();

            using (var dbs = new Dal.CashLogContext())

            {

                var result = from a in dbs.BillNames

                             where (QueryCondition(a, id, (ele, arr) => { return arr.Contains(ele.ID); }) 

                             select a;

            }

            return queryResult;

        }

        public bool QueryCondition<T>(BillName ba, T[] conditionArray, Func<BillName, T[], bool> TestEqual)

        {

            if (conditionArray != null)

                return TestEqual(ba, conditionArray);

            else

                return true;

        }

然后会提示错误A lambda expression with a statement body cannot be converted to an expression tree
,就在lambda表达式那句话上。想想这也没什么不对的啊。然后查了一下,找到了这个链接
大意是说,如果是和数据库相关的(IQueryable类型),是要准备翻译成sql语句的,所以不能使用复杂的lambda条件,只能使用简单的。使用复杂的lambda语句,只能针对IEnumerable类型。

解决方案:
1、将 (ele, arr) => { return arr.Contains(ele.ID); 改为 (ele, arr) => arr.Contains(ele.ID); 就可以了。
2、或者,使用AsEnumerable()函数强制转化为IEnumerable。

时间: 2024-11-13 08:13:41

简单和复杂的lambda表达式的相关文章

entity framework 新手入门篇(1.5)-lambda表达式与linq

在建立好了EF模型之后,先不着急使用它,在使用它之前,你还需要了解两个相关的技术,lambda表达式与linq. 作为微软C#语言中重要的语法糖-lambda表达式与LINQ,本质都是一个方法,以lambda表达式为例: x=>x+1;就是一个完整的lambda表达式. 其等同于一个匿名的方法: int anonymous(int x) { return x+1; } 考虑一下这个方法中最重要的部分,也就两个部分:传入的参数,返回的参数. 返回值类型,参数类型都是可以进行推断的,就像C#中的VA

释放Android的函数式能量(I):Kotlin语言的Lambda表达式

原文标题:Unleash functional power on Android (I): Kotlin lambdas 原文链接:http://antonioleiva.com/operator-overloading-kotlin/ 原文作者:Antonio Leiva(http://antonioleiva.com/about/) 原文发布:2015-08-05 虽然Java 8中已包含一些函数式工具,且如你想象那样Android开发者还不能够立即(或许甚至根本不能)使用这些工具,但是如果

[C#基础]c#恶补之Lambda表达式

今天在看别人的代码时发现了这个--"=>",看起来像c语言中的指针,又像是这个表情--":)",不管像什么,确实把我难倒了,于是决定学习一下. 简单地说,Lambda表达式就像是匿名委托. using UnityEngine; using System.Collections; //若要创建 Lambda 表达式,需要在 Lambda 运算符 => 左侧指定输入参数(如果有), //然后在另一侧输入表达式或语句块. //仅当 lambda 只有一个输入参

C++11 lambda表达式在for_each和transform算法下的使用

以前,在lambda表达式没有进入标准的时候,对容器的遍历等涉及到使用函数指针的情况,一般人会懒得使用std::for_each,或std::transform,也许只是一个短短的几句话,却要单独写个函数,或函数对象,写的代码反而不如自己用for循环来的快. 但是,C++11引入了lambda表达式后,一切都变的简单了! 1.lambda表达式 lambda表达式是一个匿名函数,用它可以非常方便的表示一个函数对象,先简单说一下lambda表达式,下面这张图表示了C++11中lambda表达式的写

Java8 Lambda表达式和流操作如何让你的代码变慢5倍

原文出处:ImportNew 有许许多多关于 Java 8 中流效率的讨论,但根据 Alex Zhitnitsky 的测试结果显示:坚持使用传统的 Java 编程风格——iterator 和 for-each 循环——比 Java 8 的实现性能更佳. Java 8 中的 Lambda 表达式和流(Stream)受到了热烈欢迎.这是 Java 迄今为止最令人激动的特征.这些新的语言特征允许采用函数式风格来进行编码,我们可以用这些特性完成许多有趣的功能.这些特性如此有趣以至于被认为是不合理的.我们

Java的Lambda表达式

Java的Lambda表达式 1. 什么是Lambda表达式 简单的说,Lambda表达式就是匿名方法.Lambda表达式让程序员能够使用更加简洁的代码,但是同样也使代码的可读性比较差. Lambda表达式也叫做匿名方法或者闭包. 2. 和匿名内部类做对比 Lambda是匿名方法,这个时候我们会想想到匿名内部类,我们来回想一下匿名内部类的用法,比如下面的代码就是使用匿名内部类实现了一个线程. public class Test { public static void main(String[]

C++11新特性——lambda表达式

C++11的一大亮点就是引入了Lambda表达式.利用Lambda表达式,可以方便的定义和创建匿名函数.对于C++这门语言来说来说,"Lambda表达式"或"匿名函数"这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等.今天,我们就来简单介绍一下C++中Lambda表达式的简单使用. 声明Lambda表达式 Lambda表达式完整的声明格式如下: [capture list] (params list) m

python lambda表达式简单用法

转自:http://www.cnblogs.com/guigujun/p/6134828.html 习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: 1 2 3 4 5 6 7 8 # 普通条件语句 if 1 == 1:     name = 'wupeiqi' else:     name = 'alex'   # 三元运算 name = 'wupeiqi' if 1 == 1 else 'alex' 对于简单的函数,也存在一种简便的表示方式,即:lambda表达式

Linq基础+Lambda表达式对数据库的增删改及简单查询

一.Linq to sql 类 高集成化的数据库访问技术 使用Linq可以代替之前的Ado.Net,省去了自己敲代码的实体类和数据访问类的大量工作 实体类: 添加一个Linq to sql 类 ----选择要使用的数据库---- 拖入要使用的表  需要立即保存 就相当于创建实体类 如果进行属性扩展,在App_Code下添加类,类名同表名一致.将该类在访问修饰符后加上partial,将该类定为实体类的一部分 数据访问类: 不用在App_Code下再建数据访问类了. 直接在使用数据访问类的地方用数据