Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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# Linq中的DocumentDb空间距离返回奇怪的结果_C#_Linq_Azure_Azure Cosmosdb - Fatal编程技术网

C# Linq中的DocumentDb空间距离返回奇怪的结果

C# Linq中的DocumentDb空间距离返回奇怪的结果,c#,linq,azure,azure-cosmosdb,C#,Linq,Azure,Azure Cosmosdb,当我对两个相同的点(Microsoft.Azure.Documents.Spatial)执行documentdb linq距离查询时,我会得到不同的结果 下面的测试返回一个包含一个LocationDocument的列表。test2返回一个空列表。但isEqual布尔值返回true,因此我无法理解为什么它们返回不同的结果。我已经手动确认经度和纬度也是一样的 // one document var test = MyCollectionRepository<LocationDocument&g

当我对两个相同的点(Microsoft.Azure.Documents.Spatial)执行documentdb linq距离查询时,我会得到不同的结果

下面的测试返回一个包含一个LocationDocument的列表。test2返回一个空列表。但isEqual布尔值返回true,因此我无法理解为什么它们返回不同的结果。我已经手动确认经度和纬度也是一样的

// one document
var test = MyCollectionRepository<LocationDocument>
           .GetItems(x => x.Point.Distance(x.Point) < radius)
           .ToList();   

// no documents
var test2 = MyCollectionRepository<LocationDocumentDocument>
            .GetItems(x => x.Point.Distance(point) < radius)
            .ToList();

// true
bool isEqual = point.Equals(test[0].Point);
编辑:

我已更新到Microsoft.Azure.DocumentDB库(1.4.1)的最新版本,问题已更改。正如评论中提到的,问题似乎与我的CultureInfo设置有关。我在一个非美国文化中(准确地说是en-ZA)

test2随后抛出异常,而test1仍在输出预期结果。我得到了一个总的例外。然后,我只需将enablescan-in查询添加到标题中。下面是您如何做到这一点的:

public static IReadOnlyCollection<T> GetItems(Expression<Func<T, bool>> predicate)
{
    var items = Client.CreateDocumentQuery<T>(Collection.DocumentsLink, new FeedOptions { EnableScanInQuery = true })
        .Where(predicate)
        .ToList();
    return items;
}
公共静态IReadOnlyCollection GetItems(表达式谓词)
{
var items=Client.CreateDocumentQuery(Collection.DocumentsLink,newfeedoptions{EnableScanInQuery=true})
.Where(谓词)
.ToList();
退货项目;
}

这是由于在非EN语言环境设置中构建LINQ to SQL查询时,DocumentDB SDK中存在一个错误(现已修复):

说得好。很可能就是这样。不幸的是,Point没有.ToString(),但我进行了编辑以包含Double。另一件事是,我知道测试[0]点和点之间的距离小于半径(点是相同的浮点值),因此我无法理解为什么不返回该半径中的点。我想我一定是从根本上误解了什么。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。@JanAagaardMeier纠正我的错误,它确实回答了问题。我们声明问题是由于SDK中的错误造成的。我无法用这些数据重现此问题。你能把半径的值加进去吗。活动ID也会有所帮助。这是由于DocumentDB SDK在非EN语言环境设置中构建LINQ to SQL查询时出现错误所致:。即将修复。我们相信已修复此问题,但希望确认。你能提供一个复制项目吗?您是否使用的CultureInfo不是en US,甚至不是en ZA(我看到您来自Kaapstad),我们已经发布了.NET SDK的1.4.1。请你检查一下,看看这是否解决了你的问题。请在这里报告。谢谢你的更新。是的,我正在使用en ZA cultureInfo(开普敦的确如此:))。现在问题已经改变了。我将编辑问题以反映变化。
point.Position.Latitude.ToString(); //18.4239
test[0].Point.Position.Latitude.ToString(); //18.4239

point.Position.Longitude.ToString(); //-33.9253
test[0].Position.Longitude.ToString(); //-33.9253
public static IReadOnlyCollection<T> GetItems(Expression<Func<T, bool>> predicate)
{
    var items = Client.CreateDocumentQuery<T>(Collection.DocumentsLink, new FeedOptions { EnableScanInQuery = true })
        .Where(predicate)
        .ToList();
    return items;
}