动态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?"不兼容和"字符串"

我该如何解决这个问题?

谢谢!

动态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使用对YourTypepropertyName的反射来计算lambda表达式的类型参数应该是什么。您得到的lambda表达式应该用作.Where()扩展方法的参数。

如果你不想把guid作为参数传递,你可以用它来比较字符串和guid:

clause = "Id.Value.Equals(Guid('"" + values[0] + "'"))";

这是有效的。

或者在你的例子中:

clause = propertyName + ".Value.Equals('"" + values[0] + "'")";