System.Linq.Dynamic.Core 无法比较 'object' 类型
System.Linq.Dynamic.Core cannot compare 'object' type
我正在尝试 运行 使用以下模型的动态查询:
public class Index
{
public long Position { get; set; }
public object[] Values { get; set; }
}
使用这样的数据样本:
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
数据类型吗?
如果您使用 .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();
我正在尝试 运行 使用以下模型的动态查询:
public class Index
{
public long Position { get; set; }
public object[] Values { get; set; }
}
使用这样的数据样本:
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
数据类型吗?
如果您使用 .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();