DocumentDB неподдерживаемый запрос

Я пытаюсь использовать словарь в IQueryable, но получаю ошибку во время выполнения, я знаю, что проблема возникает, потому что в реальном времени IQueryable не знаком с этим объектом, я пытаюсь преобразовать IQueryable в IEnumerable, но у меня проблема с выполнением запроса. Может кто-нибудь подскажет, как выполнить эту функцию?

У меня такой код:

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 к запросу, я получил пустой набор ....

"SELECT * FROM c WHERE (CONTAINS (LOWER (c [\" courseName \ "]), @ text) OR CONTAINS (LOWER (c [\" courseDescription \ "]), @ text)) И (udf.CourseContainsKey (c [\ "Курсы \"], @ courseId) = false) ЗАКАЗАТЬ c [\ "courseName \"] ASC "

Спасибо

Спасибо,

MAK


person MAK    schedule 26.09.2017    source источник


Ответы (1)


{"Метод ContainsKey не поддерживается."}

В зависимости от вашего запроса вы можете использовать следующий код:

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

Кроме того, если вы включите запрос между разделами, вы получите следующую ошибку:

Межсекционный запрос с функциями TOP / ORDER BY или агрегатными функциями не поддерживается.

Если фильтр не может быть выполнен на стороне CosmosDB, я предположил, что вам нужно извлечь записи со стороны лазурного, а затем отфильтровать на стороне клиента. Кроме того, существует аналогичная проблема, вы можете обратиться к здесь < / а>.

ОБНОВЛЕНИЕ:

Образец документа:

{
  "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

ОБНОВЛЕНИЕ 2:

Для фильтрации определенного названия курса, не содержащегося в свойстве Courses, я предположил, что вы можете использовать Пользовательские функции, вот фрагмент кода, на него можно сослаться:

udf.CourseContainsKey:

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

   return courses.hasOwnProperty(courseName);
}

Тест:

введите здесь описание изображения

ОБНОВЛЕНИЕ 3:

Я не нашел лучшего способа создать запрос с помощью 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();
person Bruce Chen    schedule 28.09.2017
comment
Привет, спасибо за ваш ответ, это решило часть проблемы, у меня два вопроса 1. Когда мы используем Keys.Contains, мы действительно снижаем производительность, если сравнивать его с ContainsKey, я вижу, что запрос равен IN ( \ Коллекция \, \ мат \, \ Physic \). 2.! X.Courses.Keys.Contains (requestCourse) не работает, он возвращает пустой набор (я уверен, что запрос не пустой), в чем разница? запрос - ARRAY_CONTAINS (root [\ Courses \] [\ Keys \], \ philo \) - person MAK; 28.09.2017
comment
Я проверил запрос и обновил свой ответ на предмет модификации. - person Bruce Chen; 29.09.2017
comment
Привет, это все еще не решает проблему, равную (NOT (root [\ Courses \] [\ phil \]! = Null), и возвращает пустой набор :-( - person MAK; 29.09.2017
comment
Привет, он все еще не работает, я получил пустой набор, запрос переведен в AND (root [\ Courses \] [\ phil \] = null), (я уверен, что запрос не пустой набор). - person MAK; 06.10.2017
comment
x.Courses [requestCourse] == null проблема не решена, я получил пустой набор, linq переводит в запрос SQL: root [\ Courses \] [\ philo \] = null - person MAK; 05.11.2017
comment
Не могли бы вы показать образец вашего документа? Я проверил запрос по моему документу, вы можете предоставить образец своего документа, я бы проверил его на своей стороне. - person Bruce Chen; 09.11.2017
comment
Основываясь на вашем образце документа, я провел несколько тестов и обновил свой ответ, вы можете сослаться на него. - person Bruce Chen; 13.11.2017
comment
спасибо за ответ, не могли бы вы объяснить, как я могу использовать его с помощью кода C #? Если у меня есть код, который нужно определить, относится ли курс к моему основному предмету, а студент не посещает этот курс (как в моем вопросе о происхождении), большое спасибо! - person MAK; 13.11.2017
comment
Я только что обновил свой ответ фрагментом кода, вы могли бы сослаться на него. - person Bruce Chen; 14.11.2017