Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表上的不同运算符<;字符串>;_C#_Linq_Axapta - Fatal编程技术网

C# 列表上的不同运算符<;字符串>;

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是

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

我哪里出错了?

你试过了吗

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();