如何解决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 举报,一经查实,本站将立刻删除。