动态LINQ - 无法在GUID和字符串之间进行转换

JQu*_*ile 5 c# linq

我正在动态构建LINQ语句.我正在构建的LINQ语句纯粹用于WHERE子句.

string[] values = GetPropertyValues(); 
string propertyName = GetPropertyName();

string clause = string.Empty;
if (values.Length > 0)
  clause = propertyName + "==\"" + values[0] + "\"";
Run Code Online (Sandbox Code Playgroud)

据我所知,我的LINQ查询看起来是正确的.但是当它被执行时,我收到一个错误,上面写着:

运算符'=='与操作数类型'Guid?'不兼容?和'字符串'

我该如何解决这个问题?

谢谢!

小智 7

对我来说没有参数

"Id.Equals(Guid(\"D243372F-7ED0-40E6-B93D-6165F7521C29\"))"
Run Code Online (Sandbox Code Playgroud)

用"价值"不起作用.错误apear

"{没有属性或字段'价值'存在于'Guid'类型中(在索引3处)}"


Mic*_*der 5

对于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();
Run Code Online (Sandbox Code Playgroud)


Mik*_*win 0

听起来 GetPropertyName() 返回的属性是 Guid 类型(我从错误中猜测),但您试图将它与您声明为字符串的 value[0] 的内容进行比较。

动态 Linq 允许您在 where 子句中定义参数,以便您可以执行以下操作

string clause = propertyName + "= @1";
LambdaExpression expr = Dynamic.ParseLambda( typeof(YourType), typeof(bool), clause, values[0]);
Run Code Online (Sandbox Code Playgroud)

其中YourType是 source 中项目的类型IQueryable。因此,例如,如果您的源查询是,IQueyable<Customer>那么YourType将是Customer. 无论所指示的属性类型是什么,这都将起作用propertyName

当进行解析时,Dynamic Linq 会使用YourType和上的反射来确定 lambda 表达式的类型参数应该是什么propertyName。您得到的 lambda 表达式应该用作扩展方法的参数.Where()