我正在动态构建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处)}"
对于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)
听起来 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()。