我正在动态构建LINQ语句。我正在构建的LINQ语句纯粹用于WHERE子句。
string[] values = GetPropertyValues();
string propertyName = GetPropertyName();
string clause = string.Empty;
if (values.Length > 0)
clause = propertyName + "==\"" + values[0] + "\"";
据我所知,我的LINQ查询看起来是正确的。但是当它被执行时,我收到一个错误,上面写着:
运算符'=='与操作数类型'Guid不兼容?'和'字符串'
如何解决此问题?
谢谢!
答案 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会在YourType
和propertyName
上使用反射来计算lambda表达式的类型参数应该是什么。您获得的lambda表达式应该用作.Where()
扩展方法的参数。
答案 4 :(得分:0)
如果您不想将guid作为参数传递,可以将其用于字符串和guid比较:
clause = "Id.Value.Equals(Guid(\"" + values[0] + "\"))";
这是有效的。
......或者在你的例子中:
clause = propertyName + ".Value.Equals(\"" + values[0] + "\")";