2012-02-24 80 views
5

我正在动态构建LINQ语句。我正在构建的LINQ语句纯粹用于WHERE子句。动态LINQ - 无法在GUID和字符串之间转换

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

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

从我所知道的,我的LINQ查询看起来是正确的。但是,当它被执行,我收到一个错误,指出:“?的Guid”

操作“==”与操作数类型不兼容和“字符串”

我该如何解决这个问题?

谢谢!

+0

看看这里:http://weblogs.asp.net/ scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx – 2012-02-24 19:23:19

+0

您是否会提供值和propertyName的示例数据? – 2012-02-24 20:04:05

回答

0

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

动态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会指出lambda表达式的类型参数应使用YourTypepropertyName上的反射。你得到的lambda表达式就是你应该用作.Where()扩展方法的参数。

+1

+1这是正确的答案(尽管值得一提的是'Where'扩展方法也支持命名参数,所以不需要调用这个静态方法)。 OP在做什么和这个(我想指出)之间的实际区别在于* value *在这种情况下不必再是字符串;它可以是一个实际的Guid实例。在这种情况下,'GetPropertyValues()'将需要返回实际值,而不是它们的字符串表示。 – Groo 2012-02-24 21:21:19

+0

非常正确。 GetPropertyValues需要是object []类型而不是string []。 – 2012-02-24 21:49:41

3

对于一个空值,像这样的工作:

,但它显然是一个相当特殊的情况。

PredicateBuilder通过阿尔巴哈利可能是一个更好的解决方案完全。

+0

也许GetPropertyName()返回一个非字符串对象。所以我想它应该是字符串propertyName = GetPropertyName()。ToString(); – 2012-02-24 20:15:22

+0

@Love:我认为它实际上以字符串形式(例如'“Id”')返回属性名称。基本上,你需要构建一个动态的where子句(将某个属性的值与不同的值进行比较)。但是当动态LINQ编译表达式时,它不能将'Id'(这是一个'Nullable ')的值与'String'进行比较。 – Groo 2012-02-24 20:24:14

+1

你刚刚救了我的一天。我现在可以和我的孩子一起去野餐:D – 2016-10-30 13:27:25

5

对于动态linq使用查询属性和Equals()方法中的GUID比较,就像在提供的示例中一样。

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(); 
0

如果你不想通过GUID作为一个参数,你可以使用字符串和GUID的比较:

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

也就是说作品。

...或者是在你的榜样:

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

对我的作品不带参数

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

随着 “值” 是行不通的。错误apear

“{无属性或字段 '值' 存在于型 '的Guid'(索引3)}”