动态LINQ-无法在GUID和字符串之间转换
本文关键字:字符串 之间 转换 GUID LINQ- 动态 | 更新日期: 2023-09-27 18:25:38
我正在动态构建一个LINQ语句。我正在构建的LINQ语句纯粹用于WHERE子句。
string[] values = GetPropertyValues();
string propertyName = GetPropertyName();
string clause = string.Empty;
if (values.Length > 0)
clause = propertyName + "=='"" + values[0] + "'"";
据我所知,我的LINQ查询看起来是正确的。但当它被执行时,我收到一个错误,上面写着:
运算符"=="与操作数类型"Guid?"不兼容和"字符串"
我该如何解决这个问题?
谢谢!
在没有参数的情况下适用于我
"Id.Equals(Guid('"D243372F-7ED0-40E6-B93D-6165F7521C29'"))"
使用"Value"不起作用。错误apear
"{类型"Guid"(位于索引3)中不存在属性或字段"Value"}"
对于GUID与动态linq的比较,请使用查询属性和Equals()方法,如提供的示例中所示。
var items = new[]
{
new { Id = Guid.Empty },
new { Id = Guid.NewGuid() },
new { Id = Guid.NewGuid() }
};
var result = items.AsQueryable()
.Where("Id.Equals(@0)", Guid.Empty)
.Any();
对于一个可以为null的值,类似这样的操作会起作用:
clause = "Id.Value.ToString()=='"a'""; /* Id is of type Guid? */
但这显然是一个相当具体的案例。
Albahari的PredicateBuilder
可能是一个更好的解决方案。
听起来GetPropertyName()返回的属性的类型是Guid(我猜是错误),但您正试图将其与声明为字符串的值[0]的内容进行比较。
Dynamic Linq允许您在where子句中定义参数,以便执行
string clause = propertyName + "= @1";
LambdaExpression expr = Dynamic.ParseLambda( typeof(YourType), typeof(bool), clause, values[0]);
其中CCD_ 2是源CCD_。因此,例如,如果您的源查询是IQueyable<Customer>
,那么YourType
将是Customer
。无论propertyName
指示的属性类型是什么,这都会起作用
在进行解析时,Dynamic Linq使用对YourType
和propertyName
的反射来计算lambda表达式的类型参数应该是什么。您得到的lambda表达式应该用作.Where()
扩展方法的参数。
如果你不想把guid作为参数传递,你可以用它来比较字符串和guid:
clause = "Id.Value.Equals(Guid('"" + values[0] + "'"))";
这是有效的。
或者在你的例子中:
clause = propertyName + ".Value.Equals('"" + values[0] + "'")";