C# 列表上的不同运算符<;字符串>;
我试图从Ax存储库中获取不同的字符串值,但是我得到了很多相同的字符串(字符串只包含数字) 我哪里出错了?你试过了吗C# 列表上的不同运算符<;字符串>;,c#,linq,axapta,C#,Linq,Axapta,我试图从Ax存储库中获取不同的字符串值,但是我得到了很多相同的字符串(字符串只包含数字) 我哪里出错了?你试过了吗 var ret = context.XInventTransBackOrder .Where(i => i.BatchRouteId != "") .Select(i => i.BatchRouteId) .ToList(); ret = ret .Distinct() .ToList(); 例如,如果BatchRouteId是
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 请注意,某些类型实现隐式转换,使您认为它们是另一种类型。您可以将
string
传递给XName
参数,而无需显式转换,string
将自动转换为XName
更新#2 根据nk2003dec的评论,上下文是
LinqToDynamicsAx
。我不知道这个接口,但它可能没有实现Distinct
。在这种情况下,您可以使用System.LINQ.Enumerable.AsEnumerable
扩展方法将上下文从XY-LINQ更改为Object LINQ
var ret = context.XInventTransBackOrder
.Select(i => i.BatchRouteId)
.Where(id => id != "")
.AsEnumerable()
.Distinct()
.ToList();
我还将
选择
和其中
,因为这简化了对BatchRouteId的访问
X++没有明确的运算符。延迟执行将尝试在ToList()上执行,并将因此而失败。BatchRouteId的类型是什么?数据示例会很好。是的BatchRouteId是字符串,可能需要修剪?var ret=context.XInventTransBackOrder.Where(i=>i.BatchRouteId!='').Select(i=>i.BatchRouteId.Trim()).Distinct().ToList();我试过了,它对我有效,所以你有点怪怪的。如果BatchRouteId是一个字符串,并且所讨论的字符串实际上是相同的,那么Distinct()将删除它们。因此,要么a)BatchRouteId不是一个真正的字符串,要么b)这些相同的字符串实际上并不相同。100美元的问题是:为什么?小心点,这可能非常昂贵,具体取决于原始列表中返回的项目数。这首先将所有内容提取到系统中,然后在内存中创建不同的值。你的上下文是什么类型的?它是否转换为某种类型的AX查询或Web服务调用?那个API理解Distinct的概念吗?我的上下文是LinqToDynamicsAx上下文。我得到10个不同的字符串。否则我会得到116条字符串。不确定API是否理解distinct。它将C#代码更改为X++
var ret = context.XInventTransBackOrder
.Select(i => i.BatchRouteId)
.Where(id => id != "")
.AsEnumerable()
.Distinct()
.ToList();