【问题标题】:Dynamic Linq query on relationship with foreign key of type Guid动态 Linq 查询与 Guid 类型的外键的关系
【发布时间】:2014-02-08 12:20:51
【问题描述】:

我正在使用System.Linq.Dynamic 使用字符串格式的 where 子句动态查询 IQueryable 数据源,如下所示:

var result = source.Entities.Where("City = @0", new object[] { "London" });

上面的例子运行良好。但现在我想查询 Guid 类型的外键属性,如下所示:

var result = source.Entities.Where("CompanyId = @0", new object[] { "838AD581-CEAB-4B44-850F-D05AB3D791AB" });

这不起作用,因为默认情况下 Guid 无法与字符串进行比较。而且我必须将 guid 作为字符串提供,因为它最初来自 json-request,而 json 不支持 guid。

首先,这是否是查询关系的正确方法,还是有其他语法可以做到这一点?

其次,如果要比较的实体属性是 guid 类型,我如何修改 Dynamic Linq 项目中的 Dynamic.cs 以自动将字符串转换为 guid?

【问题讨论】:

  • 为什么将字符串作为参数而不是 Guid 传递?尝试使用 Guid.Parse 并通过 guid
  • 正如我所写,查询来自 json 请求,我无法将可能的 guid 字符串转换为 guid。如果可以修改 Dynamic.cs 以检测我何时尝试将 Guid 与字符串进行比较然后进行转换,那将是最好的。

标签: c# sql expression-trees dynamic-linq


【解决方案1】:

你有很多解决方法。我认为最简单的方法是像这样更改您的查询

var result = source.Entities.Where("CompanyId.Equals(@0)", new object[] { Guid.Parse("838AD581-CEAB-4B44-850F-D05AB3D791AB") });

如果您想使用运算符===,那么在Dynamic.cs 中您需要像这样更改interface IEqualitySignatures : IRelationalSignatures

interface IEqualitySignatures : IRelationalSignatures
{
    ....
    F(Guid x, Guid y);
    ....
}

之后你可以使用下一个查询

var result = source.Entities.Where("CompanyId=@0", new object[] { Guid.Parse("838AD581-CEAB-4B44-850F-D05AB3D791AB") });

var result = source.Entities.Where("CompanyId==@0", new object[] { Guid.Parse("838AD581-CEAB-4B44-850F-D05AB3D791AB") });

但是如果你想使用string 参数,你需要在ExpressionParser 类中更改ParseComparison 方法。您需要为这样的操作数类型添加另一个检查

....
//you need add this condition
else if(left.Type==typeof(Guid) && right.Type==typeof(string)){
    right = Expression.Call(typeof(Guid).GetMethod("Parse"), right);
}
//end condition
else {
    CheckAndPromoteOperands(isEquality ? typeof(IEqualitySignatures) : typeof(IRelationalSignatures), op.text, ref left, ref right, op.pos);
}
....

然后你的查询就可以工作了

var result = source.Entities.Where("CompanyId = @0", new object[] { "838AD581-CEAB-4B44-850F-D05AB3D791AB" });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2020-03-30
    • 2020-04-20
    • 2020-01-02
    • 1970-01-01
    相关资源
    最近更新 更多