日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#中Lambda表达式类型Expression不接受lambda函数

發布時間:2024/9/21 C# 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#中Lambda表达式类型Expression不接受lambda函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在EF Core中我們經常會用System.Linq.Expressions系統命名空間的Expression<TDelegate>類型來作為EF Core的查詢條件,比如:

using EFLambdaExpression.Entities; using System; using System.Linq; using System.Linq.Expressions;namespace EFLambdaExpression {class Program{static void Main(string[] args){using (FinanceDigitalToolContext dbContext = new FinanceDigitalToolContext()){Expression<Func<User, bool>> userExperssion = u => u.UserCode != null;var users = dbContext.User.Where(userExperssion).ToList();}Console.WriteLine("Press key to quit....");Console.ReadLine();}} }

但是如果我們將Expression<Func<User, bool>> userExperssion = u => u.UserCode != null改為Expression<Func<User, bool>> userExperssion = u => { return u.UserCode != null; }那么C#會報錯,提示:

A lambda expression with a statement body cannot be converted to an expression tree

所以Expression<Func<User, bool>> userExperssion不能接受帶函數體的u => { return u.UserCode != null; }這種lambda函數,它只支持簡單的lambda表達式u => u.UserCode != null

?

雖然Expression<Func<User, bool>> userExperssion右邊的lambda表達式中可以使用自定義函數,但是不建議這么做,因為這么做會導致EF Core對數據庫表做全表查詢

比如我們先執行下面的代碼:

using EFLambdaExpression.Entities; using Microsoft.EntityFrameworkCore; using System; using System.Linq; using System.Linq.Expressions;namespace EFLambdaExpression {class Program{static void Main(string[] args){using (FinanceDigitalToolContext dbContext = new FinanceDigitalToolContext()){Expression<Func<User, bool>> userExperssion = u => EF.Functions.Like(u.UserCode, "%ADMIN%");var users = dbContext.User.Where(userExperssion).ToList();}Console.WriteLine("Press key to quit....");Console.ReadLine();}} }

可以從EF Core的日志中看到生成了如下SQL語句:

=============================== EF Core log started =============================== Executed DbCommand (122ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT [u].[ID], [u].[CompanyCode], [u].[CreateTime], [u].[DataStatus], [u].[FirstName], [u].[LastName], [u].[MailAddress], [u].[MiddleName], [u].[Password], [u].[UserCode], [u].[Username] FROM [MD].[User] AS [u] WHERE [u].[UserCode] LIKE N'%ADMIN%' =============================== EF Core log finished ===============================

因為EF.Functions.Like方法是EF Core定義的系統函數,所以我們看到EF Core可以將該C#方法轉換為SQL查詢中的LIKE語句作為查詢的WHERE條件。

?

如果現在我們將EF.Functions.Like的調用放到我們自定義的一個C#方法UserCodeLike中去,然后在Expression<Func<User, bool>> userExperssion右邊的lambda表達式中調用自定義方法UserCodeLike,代碼如下所示:

using EFLambdaExpression.Entities; using Microsoft.EntityFrameworkCore; using System; using System.Linq; using System.Linq.Expressions;namespace EFLambdaExpression {class Program{static bool UserCodeLike(User user, string pattern){return EF.Functions.Like(user.UserCode, pattern);}static void Main(string[] args){using (FinanceDigitalToolContext dbContext = new FinanceDigitalToolContext()){Expression<Func<User, bool>> userExperssion = u => UserCodeLike(u, "%ADMIN%");var users = dbContext.User.Where(userExperssion).ToList();}Console.WriteLine("Press key to quit....");Console.ReadLine();}} }

可以從EF Core的日志中看到生成了如下SQL語句:

=============================== EF Core log started =============================== Executed DbCommand (124ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT [u].[ID], [u].[CompanyCode], [u].[CreateTime], [u].[DataStatus], [u].[FirstName], [u].[LastName], [u].[MailAddress], [u].[MiddleName], [u].[Password], [u].[UserCode], [u].[Username] FROM [MD].[User] AS [u] =============================== EF Core log finished ===============================

可以看到,雖然最后查出來的結果是一樣的,但是這次EF Core對User表做了全表查詢,在SQL的查詢語句中沒有生成任何WHERE條件,說明EF Core不認識我們定義的UserCodeLike方法,不知道怎么將UserCodeLike方法轉換為對應的SQL語句,所以干脆就做了全表查詢,將User表的數據從數據庫全查出來后,再調用我們的UserCodeLike方法來過濾數據,如果User表的數據量非常大,這樣效率其實會非常低。所有不建議在EF Core的lambda表達式中使用自定義函數。

?

總結

以上是生活随笔為你收集整理的C#中Lambda表达式类型Expression不接受lambda函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。