微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

System.Linq.Dynamic.Core无法比较“对象”类型

如何解决System.Linq.Dynamic.Core无法比较“对象”类型

我正在尝试使用以下模型运行动态查询

var indexes = new Dictionary<long,Index>();
indexes.Add(1,new Index { Position = 1000,Values = new object[3] { "Welly","Chandra",26 } });
indexes.Add(2,new Index { Position = 1001,Values = new object[3] { "Darma","Angelo",25 } });
indexes.Add(3,new Index { Position = 1002,Values = new object[3] { "Abby","Yeremia",28 } });
indexes.Add(4,new Index { Position = 1003,Values = new object[3] { "Yonathan","Gunawan",22 } });
indexes.Add(5,new Index { Position = 1004,Values = new object[3] { "Aldy","Santoso",24 } });
var queryable = indexes.Values.AsQueryable();
var result = queryable.Where("Values[1] = \"Yeremia\" || Values[2] = 24").ToList();

并带有以下示例数据:

system.invalidOperationException: The binary operator Equal is not defined for the types 'System.Object' and 'system.int32'.

但是它总是抛出异常:

object

在这里不能使用{{1}}数据类型吗?

解决方法

可以使用.Equals(),它会首先检查类型是否相同,如果不相同,则将强制转换为运行时类型。

var result = queryable.Where(
    "Values[1].Equals(\"Yeremia\") || Values[2].Equals(24)").ToList();

如评论中所述,比较对象时存在挑战。对于==,您不能将Int32与没有强制转换的对象进行比较。同样,在使用.Equals()时,左侧值不能为null,否则将引发NullReferenceException。

如果可能的话,一种更好的方法将是类似ValueTuple的方法,该方法将通过名称而不是索引进行强类型化和引用。这样不仅可以避免NullReferenceExceptions的侵害,而且还可以避免装箱和投射操作。

public class Index
{
    public long Position { get; set; }
    public (string,string,int) Values { get; set; }
}
var indexes = new Dictionary<long,Index>();
    indexes.Add(1,new Index { Position = 1000,Values = ("Welly","Chandra",26) });
    indexes.Add(2,new Index { Position = 1001,Values = ("Darma","Angelo",25) });
    indexes.Add(3,new Index { Position = 1002,Values = ("Abby","Yeremia",28) });
    indexes.Add(4,new Index { Position = 1003,Values = ("Yonathan","Gunawan",22) });
    indexes.Add(5,new Index { Position = 1004,Values = ("Aldy","Santoso",24) });
    
var queryable = indexes.Values.AsQueryable();
var result = queryable.Where(
    "Values.Item2 == \"Yeremia\" || Values.Item3 == 24").ToList();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。