表达式来比较Guid属性与字符串值,然后将其转换为TSQL
本文关键字:然后 转换 TSQL 比较 Guid 属性 字符串 表达式 | 更新日期: 2023-09-27 17:54:20
我使用一个非常基本的表达式树生成器来创建SQL表达式。
例如,要为假设的类User
创建一个表达式,比较String
的属性"Name"和String
的值"john",我使用一段类似于下面的代码:
var propertyInfo = typeOf(User).GetProperties().First(p=>p.Name=="Name");
Expression.Call(
Expression.Property(Expression.Parameter(typeof(User), "val"), propertyInfo),
typeof(string).GetMethod("Contains"),
Expression.Constant("john")
)
生成(经过几行代码和EF
干预后)类似于:
[...] Name LIKE '%john%' [...]
我的问题是Guid
属性…
我不知道如何构造表达式来比较Guid
属性和String
值,以生成一个非常简单的SQL
查询,类似于:
[...] Id='38EB4D06-E50B-4C7A-80FF-A6350051682A' [...]
我不能在Guid
和String
之间使用Equals
方法…
应该可以:
var propertyInfo = typeof(Entity).GetProperties().First(p => p.Name == "Id");
var paramExpr = Expression.Parameter(typeof(Entity));
var propertyAccessExpr = Expression.MakeMemberAccess(paramExpr, propertyInfo);
var guidExpr = Expression.Constant(Guid.Parse("38EB4D06-E50B-4C7A-80FF-A6350051682A"));
var body = Expression.Equal(propertyAccessExpr, guidExpr);
var lambda = Expression.Lambda<Func<Entity, bool>>(body, paramExpr);
Console.WriteLine(lambda); // Param_0 => (Param_0.Id == 38eb4d06-e50b-4c7a-80ff-a6350051682a)
其中Entity
为:
public class Entity
{
public Guid Id { get; set; }
}
小提琴。