Ни один из языков запросов Entity Framework (LINQ to Entities и eSQL) напрямую не поддерживает вложенные XML-запросы. Таким образом, вы не сможете делать такие вещи. Если вы не выполните XML-запрос после вызова AsEnumerable()
, что, конечно, несколько нежелательно с точки зрения производительности.
Сказав, что вы, вероятно, можете написать функцию хранения в SSDL, которая сделает этот фильтр за вас.
Откройте файл EDMX в редакторе XML и попробуйте добавить элемент в разделе StorageModel (т. Е. SSDL). <CommandText>
(я думаю, это то, что она называется) этой функции хранилища - это место, где вы можете написать соответствующий T-SQL и также можете ссылаться на параметры функции. Извините, у меня нет такого примера.
Сделав это, вы можете вызвать функцию Store в eSQL, т.е. что-то вроде этого:
SELECT VALUE treeNode FROM TreeNodes as treeNode WHERE
StorageModelNamespace.MyXmlWrapperFunctionForNVarchar('(/edumatic/assessmentItem/@type)[1]', treeNode.Data) LIKE 'multiplechoice1'
В .NET 4.0 вы также сможете написать функцию-заглушку в .NET, чтобы вы могли также вызывать эту функцию в LINQ:
т.е.
[EdmFunction("StorageModelNamespace", "MyXmlWrapperFunctionForNVarchar"]
public static string MyXmlHelper(string path, string data)
{
throw new NotImplementedException("You can only call this function in a LINQ query");
}
тогда как то так:
var query = from e in edumatic3Context.TreeNodes
where MyXmlHelper("(/edumatic/assessmentItem/@type)[1]", e.Data)
.StartsWith("multiplechoice1")
select e;
Обратите внимание, что весь приведенный выше код является просто псевдокодом. На самом деле я его не тестировал, я просто пытаюсь помочь вам начать работу.
Надеюсь, это поможет
Alex
Руководитель программы Entity Framework Team