Вы можете присоединить к ней декартову таблицу, которая будет возвращать все комбинации обоих столбцов.
select
distinct
t1.Col1,
t2.Col2
from
MyTable t1,
MyTable t2
С XML я знаю только два способа
XMLReader -> передавать большие XML-данные в или использовать объектную модель XML DOM и сразу прочитать весь XML в памяти.
Если XML большой, у нас есть файлы XML размером 80 МБ и выше, чтение XML в память снижает производительность. Не существует реального способа «объединить» два способа работы с XML-документами. Извините.
Похоже, что первая часть вашего вопроса лучше всего подойдет для проверки схемы. Если у вас есть доступ к XSD или вы можете их создавать, вы можете использовать алгоритм, подобный этому:
public void ValidateXmlToXsd(string xsdFilePath, string xmlFilePath)
{
XmlSchema schema = ValidateXsd(xsdFilePath);
XmlDocument xmlData = new XmlDocument();
XmlReaderSettings validationSettings = new XmlReaderSettings();
validationSettings.Schemas.Add(schema);
validationSettings.Schemas.Compile();
validationSettings.ValidationFlags = XmlSchemaValidationFlags.ProcessInlineSchema;
validationSettings.ValidationType = ValidationType.Schema;
validationSettings.ValidationEventHandler += new ValidationEventHandler(ValidationHandler);
XmlReader xmlFile = XmlReader.Create(xmlFilePath, validationSettings);
xmlData.Load(xmlFile);
xmlFile.Close();
}
private XmlSchema ValidateXsd(string xsdFilePath)
{
StreamReader schemaFile = new StreamReader(xsdFilePath);
XmlSchema schema = XmlSchema.Read(schemaFile, new ValidationEventHandler(ValidationHandler));
schema.Compile(new ValidationEventHandler(ValidationHandler));
schemaFile.Close();
schemaFile.Dispose();
return schema;
}
private void ValidationHandler(object sender, ValidationEventArgs e)
{
throw new XmlSchemaException(e.Message);
}
Если XML не может проверить, выдается XmlSchemaException
.
Что касается LINQ, я лично предпочитаю использовать XDocument
по возможности поверх XmlDocument
. Ваша цель в некоторой степени субъективна, и, не видя, что именно вы делаете, я не могу сказать, иди этим или иным образом с уверенностью, что это поможет тебе. Вы можете использовать XPath с XDocument
. Я должен сказать, что вы должны использовать то, что лучше всего соответствует вашим потребностям. Нет проблем с использованием иногда XPath и LINQ в других случаях. Это действительно зависит от вашего уровня комфорта, а также от масштабируемости и удобочитаемости.
Это может показаться глупым.
Но если у вас есть простые запросы, вы можете использовать регулярное выражение для файлов xml. (как они делают grep в unix / linux.)
Прошу прощения, если это не имеет никакого смысла.
XmlReader будет использовать меньше памяти, чем XmlDocument, потому что ему не нужно загружать весь XML в память за один раз.
Просто подумайте о комментариях JMarsch. Даже если ваш процесс создания XML не обсуждается, рассматривали ли вы БД (или подмножество XML-файлов, действующих как индексы) в качестве посредника? Очевидно, это принесет пользу только в том случае, если файлы XML не обновляются чаще одного или двух раз в день. Думаю, это нужно сравнить с вашим существующим механизмом кэширования.
Я не могу говорить о скорости,
Некоторое время назад я наткнулся на этот технический документ, когда пытался выполнить потоковую передачу XML: Потоковая передача XML на основе API с мощностью и функциональными обновлениями FLWOR для работы с XML в памяти, но с использованием доступа LINQ.
Может быть, кому-то это будет интересно.