2017-09-26 163 views
1

我尝试在IQueryable中使用字典,但我收到运行时错误,我知道问题发生,因为实时IQueryable不熟悉该对象,我尝试将IQueryable转换为IEnumerable,但我遇到问题查询的执行。 有人可以给我一个提示如何执行该功能?DocumentDB不支持的查询

我有以下代码:

Dictionary<String, int> coursesType= new Dictionary<string, int>();  
var userQuery = _client.CreateDocumentQuery<ObjectModel.Student>(uriStudentCollection, options). 
        Where(x =>coursesType.ContainsKey(x.MainCourse) 
        && !x.Courses.ContainsKey(requestCourse)).OrderBy(x => x.Grade).AsDocumentQuery(); 
       var feedResponse = await userQuery.ExecuteNextAsync<ObjectModel.Student>(); 

       foreach (var ad in feedResponse.AsEnumerable()) 
       { 
        results.Add(ad); 
       } 

更新状态:我仍未收到回答我的问题

***更新:我加我的文档的例子。

{ 
    "id": "a5d7f123-80d5-5094-84fb-08c3bc4ccp972", 
    "StudentName": "Philip", 
"Courses": { 
     "Math": { 
      "id": "Math", 
      "Grade": "98", 
      "Place": "NYC" 
} 
}, 
"Rank":"AA" 
} 

更新号3

我写了下面的查询:

SqlQuerySpec q = new SqlQuerySpec() 
      { 
       QueryText = "SELECT * FROM c WHERE (CONTAINS(LOWER(c[\"courseName\"]),@text) OR CONTAINS(LOWER(c[\"courseDescription\"]),@text)) AND (udf.CourseContainsKey(c[\"Courses\"],@courseId)=false)", 
       Parameters = new SqlParameterCollection() 
       { 
        new SqlParameter("@text", text), 
        new SqlParameter("@courseId", courseId) 
       } 
      }; 

当我写这样的查询,查询做工精细,但如果我添加了ORDER BY命令(c [\“courseName \”]),@ text)或CONTAINS(LOWER(c [\“ courseDescription \ “]),@文本))AND(udf.CourseContainsKey(C [\” 课程\ “],@ courseId)= FALSE)ORDER BY C [\” courseName \ “] ASC”

由于

谢谢,

MAK

回答

1

{"Method 'ContainsKey' is not supported."}

根据您查询,您可以使用下面的代码:

var userQuery = _client.CreateDocumentQuery<ObjectModel.Student>(uriStudentCollection, options). 
        Where(x =>coursesType.Keys.Contains(x.MainCourse) 
        && !x.Courses.Keys.Contains(requestCourse)).OrderBy(x => x.Grade).AsDocumentQuery(); 

此外,如果您启用跨分区查询,您会收到以下错误:如果过滤器不能在CosmosDB端执行

Cross partition query with TOP/ORDER BY or aggregate functions is not supported.

,我认为你需要拉从蔚蓝的侧面的记录,然后过滤在你的客户端。另外,这里也有类似的问题,你可以参考here

UPDATE:

样品文件:

{ 
    "id": "1ba6178b-7c22-440a-a4a2-25b4bc636b30", 
    "MainCourse": "b", 
    "Grade": "B", 
    "Courses": { 
    "a": "a", 
    "b": "b" 
    } 
} 

查询:

SELECT * FROM root WHERE ((root["MainCourse"] IN ("a", "b")) AND (root["Courses"]["a"] != null)) ORDER BY root["Grade"] ASC 

修改你的C#代码如下:

!x.Courses.Keys.Contains(requestCourse) 

//To 

x.Courses[requestCourse]==null 

UPDATE2:

为了滤除特定课程名称不包含Courses属性中,我假定你可以使用User-defined functions,这里是代码片段,你可以参考一下吧:

UDF .CourseContainsKey:

function CourseContainsKey (courses,courseName) { 
    if(courses==undefined||courseName==undefined) 
    return false; 

    return courses.hasOwnProperty(courseName); 
} 

测试:

enter image description here

UPDATE3:

我还没有发现任何更好的方法来创建与UDF的查询,你可以按照下面的代码来创建文档的查询:

var query = $"SELECT* FROM root WHERE (root[\"MainCourse\"] IN({String.Join(",", coursesType.Keys.Select(k=>$"\"{k}\"").ToArray())})) AND udf.CourseContainsKey(root[\"Courses\"],\"{requestCourse}\")=false ORDER BY root[\"Grade\"] ASC"; 
var items=client.CreateDocumentQuery<CourseSample>(UriFactory.CreateDocumentCollectionUri(DatabaseId, DocumentCollectionId), sqlExpression:query).ToList(); 
+0

嗨,感谢您的回答,它解决了问题的一部分,我有两个问题1.当我们使用Keys.Contains时,如果我们将它与ContainsKey进行比较,我们确实伤害了性能,我看到查询等于IN(\“Collection \”,\“mat \”,\“physic \”)。 2.!x.Courses.Keys.Contains(requestCourse)不工作,它返回一个空集(我确定查询不是空的),有什么不同?查询是ARRAY_CONTAINS(root [\“Courses \”] [\“Keys \”],\“philo \”) – MAK

+0

我检查了查询并更新了我的答案以进行修改。 –

+0

嗨,它仍然没有解决问题,它等于(NOT(root [\“Courses \”] [\“phil \”]!= null),它返回空集:-( – MAK