10

我试图从 Ax 存储库中获取不同的字符串值,但我得到了很多相同的字符串(字符串只包含数字)

var ret = context.XInventTransBackOrder
    .Where(i => i.BatchRouteId != "")
    .Select(i => i.BatchRouteId)
    .Distinct()
    .ToList();

我哪里错了?

4

3 回答 3

7

你有没有尝试过

var ret = context.XInventTransBackOrder
    .Where(i => i.BatchRouteId != "")
    .Select(i => i.BatchRouteId)
    .ToList();
ret = ret
    .Distinct()
    .ToList();
于 2012-11-26T14:27:36.917 回答
3

例如,如果BatchRouteIdXElement,那么可能会执行对象引用比较。在这种情况下,将代码更改为

var ret = context.XInventTransBackOrder
    .Where(i => i.BatchRouteId != null && !String.IsNullOrEmpty(i.BatchRouteId.Value))
    .Select(i => i.BatchRouteId.Value)
    .Distinct()
    .ToList();

更新#1

请注意,某些类型实现了隐式转换,使您认为它们是另一种类型。您可以将 a 传递stringXName参数而无需显式强制转换,并且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();

我也倒过来了SelectWhere因为这简化了访问BatchRouteId

于 2012-11-26T14:45:35.977 回答
2

X++ 没有不同的运算符。延迟执行将尝试在 ToList() 上执行,并因此而失败。

于 2017-11-06T08:32:51.480 回答