無法將具有語句體的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語句。      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM