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

时间:2012-02-24 19:21:59

标签: c# linq

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

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

string clause = string.Empty;
if (values.Length > 0)
  clause = propertyName + "==\"" + values[0] + "\"";

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

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

如何解决此问题?

谢谢!

5 个答案:

答案 0 :(得分:6)

为我工作,没有参数

"Id.Equals(Guid(\"D243372F-7ED0-40E6-B93D-6165F7521C29\"))"

“价值”不起作用。错误apear

  

“{'Guid'类型中没有属性或字段'值'(在索引3处)}”

答案 1 :(得分:5)

对于动态linq的GUID比较,使用查询属性和所提供示例中的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();

答案 2 :(得分:3)

对于可以为空的值,这样的东西可以起作用:

clause = "Id.Value.ToString()==\"a\""; /* Id is of type Guid? */

但这显然是一个相当具体的案例。

Albahari的PredicateBuilder可能是一个更好的解决方案。

答案 3 :(得分:0)

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

Dynamic Linq允许您在where子句中定义参数,以便您可以执行

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

其中YourType是来源IQueryable中项目的类型。因此,例如,如果您的源查询为IQueyable<Customer>,那么YourType将为Customer。无论propertyName指示的属性类型是什么,这都将有效。

当它进行解析时,Dynamic Linq会在YourTypepropertyName上使用反射来计算lambda表达式的类型参数应该是什么。您获得的lambda表达式应该用作.Where()扩展方法的参数。

答案 4 :(得分:0)

如果您不想将guid作为参数传递,可以将其用于字符串和guid比较:

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

这是有效的。

......或者在你的例子中:

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