我试图从 Ax 存储库中获取不同的字符串值,但我得到了很多相同的字符串(字符串只包含数字)
var ret = context.XInventTransBackOrder
.Where(i => i.BatchRouteId != "")
.Select(i => i.BatchRouteId)
.Distinct()
.ToList();
我哪里错了?
你有没有尝试过
var ret = context.XInventTransBackOrder
.Where(i => i.BatchRouteId != "")
.Select(i => i.BatchRouteId)
.ToList();
ret = ret
.Distinct()
.ToList();
例如,如果BatchRouteId
是XElement
,那么可能会执行对象引用比较。在这种情况下,将代码更改为
var ret = context.XInventTransBackOrder
.Where(i => i.BatchRouteId != null && !String.IsNullOrEmpty(i.BatchRouteId.Value))
.Select(i => i.BatchRouteId.Value)
.Distinct()
.ToList();
更新#1
请注意,某些类型实现了隐式转换,使您认为它们是另一种类型。您可以将 a 传递string
给XName
参数而无需显式强制转换,并且string
将自动转换为XName
.
更新#2
根据 nk2003dec 的评论,上下文是LinqToDynamicsAx
. 我不知道这个接口,但可能它没有实现Distinct
。在这种情况下,您可以使用System.Linq.Enumerable.AsEnumerable<TSource>
扩展方法将上下文从 XY-LINQ 更改为 Object-LINQ
var ret = context.XInventTransBackOrder
.Select(i => i.BatchRouteId)
.Where(id => id != "")
.AsEnumerable()
.Distinct()
.ToList();
我也倒过来了Select
,Where
因为这简化了访问BatchRouteId
X++ 没有不同的运算符。延迟执行将尝试在 ToList() 上执行,并因此而失败。