zoukankan      html  css  js  c++  java
  • 无法将具有语句体的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语句。      

  • 相关阅读:
    C++强大的背后
    C++ 非托管的vc工程中部分文件使用.Net Framwork
    C++ 基于 Visual C++6.0 的 DLL 编程实现
    C++ 中指针,指针的引用,指针的指针的区别
    C# 中重用c/c++旧模块
    C++ 打开exe文件的方法(VS2008)
    C++ 指针 指针高级<高质量编程>
    C++ 函数指针
    有用但不常见的c++函数
    C++ int & *p; //不能建立指向引用的指针;int *a; int * & p=a; //正确,指针变量的引用
  • 原文地址:https://www.cnblogs.com/gdouzz/p/8404801.html
Copyright © 2011-2022 走看看