无法将具有语句体的lambda表达式转换为表达式树
很早就碰到了这个问题,当时也没有深入的研究,趁着空闲,遂把这个问题研究清楚。
(一)普通案例
下面从一个普通的案例入手,下面准备两个List集合,都是放在内存里面的(需要模拟到远端执行的时候,我们是通过AsQueryable()来进行的)
var users = new List<Usernew User() {Id = 1, Name = "zz", CompanyId = 1},
new User(){Id = 2, Name = "fyh",CompanyId = 1},
new User(){Id = 3,Name = "testuser",CompanyId = 2},
new User(){ Id = 4,Name = "entuser",CompanyId = 2}
};
var companys = new List<Company>(){
new Company() {Id = 1,Name ="测试公司" },
new Company() {Id =2,Name ="上市公司" }
};
操作一:数据在内存,可以随意操作
下面主要看带有语句体的lambda表达式
var userCompanys=users.Join(companys, u => u.CompanyId, c => c.Id, (u, d) =>{
var des = u.Name + d.Name;
Console.WriteLine(des);
return new {UserName=u.Name, CompanyName=d.Name,Des=des};
});
数据在内存里面,我们这样写也不会报错,原因是:这里的lambda表达式在内存中,是执行的方法。
操作二:数据在远端,不能随意操作
这里我们用AsQueryable模拟数据在远端,下面这段会报错:无法将具有语句体的lambda表达式转换为表达式树;
var userCompanys2 = users.AsQueryable().Join(companys.AsQueryable(), u => u.CompanyId, c => c.Id, (u, d){
var des = u.Name + d.Name;
Console.WriteLine(des);
return new { UserName = u.Name, CompanyName = d.Name, Des = des };
});
很简单的原因是:我们无法将lambda语句体转换为表达式树,然后再转换成sql语句。
无法将具有语句体的lambda表达式转换为表达式树的更多相关文章
- 深入学习C#匿名函数、委托、Lambda表达式、表达式树类型——Expression tree types
匿名函数 匿名函数(Anonymous Function)是表示“内联”方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取 ...
- C#中的Lambda表达式和表达式树
在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...
- 16.C#初见Lambda表达式及表达式树(九章9.1-9.3)
在说明Lambda相关知识前,我们需要了解Lambda表达式常用于LINQ,那么我们来聊下LINQ. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑: ...
- Lambda表达式和表达式树
在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...
- C#复习笔记(4)--C#3:革新写代码的方式(Lambda表达式和表达式树)
Lambda表达式和表达式树 先放一张委托转换的进化图 看一看到lambda简化了委托的使用. lambda可以隐式的转换成委托或者表达式树.转换成委托的话如下面的代码: Func<string ...
- lambda表达式和表达式树(深入理解c#)
1.Lambda形式 1). Lambda表达式最冗长的形式: (显式类型的参数列表)=>{语句} 2). 大多数时候,都可以用一个表达式来表示主体,该表达式的值是Lambda的结果,在这些情况 ...
- C++--- Lambda匿名函数表达式
视频教程:https://www.bilibili.com/video/av66419552/ 格式: [capture](parameters)mutable->returm-type{}; ...
- 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型
今天写winform的时候遇到一个问题,提示: 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型, 主要是为了在子线程中更新UI线程,在wpf中同样的写法 ...
- C# 表达式树 创建、生成、使用、lambda转成表达式树~表达式树的知识详解
笔者最近学了表达式树这一部分内容,为了加深理解,写文章巩固知识,如有错误,请评论指出~ 表达式树的概念 表达式树的创建有 Lambda法 和 组装法. 学习表达式树需要 委托.Lambda.Func& ...
随机推荐
- 介绍一个golang库:fastcache
学习VictoriaMetrics源码的时候发现,VictoriaMetrics的缓存部分,使用了同一产品下的fastcache.下面分享阅读fastcache源码的的结论: 1.官方介绍 fastc ...
- python使用制表符或者换行符来添加空白--3
#!/usr/bin/python #coding=utf-8 message="python" print(message) print("\tpython" ...
- HashMap相关
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] ta ...
- Vue3.2中的setup语法糖,保证你看的明明白白!
vue3.2 到底更新了什么? 根据原文内容的更新的内容主要有以下 5 块: 1.SSR:服务端渲染优化.@vue/server-renderer包加了一个ES模块创建, 与Node.js解耦,使在非 ...
- CentOS升级polkit版本,解决 Linux Polkit 存在权限提升的漏洞 (CVE-2021-4034)
漏洞描述 受影响版本的 pkexec 无法正确处理调用参数计数,最终尝试将环境变量作为命令执行,攻击者可以通过修改环境变量来利用此漏洞,诱使 pkexec 执行任意代码,从而导致将本地权限提升为 ro ...
- CSS之常见布局|常用单位|水平垂直居中
常见布局: 1. 流式布局:百分比布局,宽高.margin.pinding都是百分比 2. 固定布局:盒子的宽高固定,如:margin.padding等 3. 浮动布局:float 4. 弹性布局:f ...
- 如何在pyqt中使用 QGraphicsView 实现图片查看器
前言 在 PyQt 中可以使用很多方式实现照片查看器,最朴素的做法就是重写 QWidget 的 paintEvent().mouseMoveEvent 等事件,但是如果要在图像上多添加一些形状,那么在 ...
- Network Kit与三七游戏共创流畅游戏体验,无惧网络延迟
本文分享于HMS Core联盟论坛<[开发者说]无惧高网络吞吐量,HMS Core Network Kit与三七游戏共创流畅游戏体验>的采访整理. 三七游戏拥有<斗罗大陆·魂师对决& ...
- URL跳转空白页参数传递封装
这东西主要是为了vue和平时打开一个空白界面_blank时的参数传递,不涉及到浏览器存储(session,local等) 众所周知,请求传参无非就用的query和params,相对应就是get和pos ...
- LockSupport、wait()、notify()
LockSupport 名词解释 LockSupport是一个在JUC包里的线程阻塞工具类,所有的方法都是静态方法,主要用途是让线程在任意位置阻塞,广泛应用在AQS和各种JUC的锁中. 代码 publ ...