Я пытаюсь получить записи из таблицы «многие» отношения «один ко многим» и добавить их в виде списка к соответствующей записи из таблицы «один».
Я также пытаюсь сделать это в одном запросе к базе данных.
Код, полученный из Linq to Sql - заполнение результата JOIN в список почти достигает ожидаемого результата, но делает один запрос базы данных на запись в таблице «one», что недопустимо. Этот код ошибки здесь:
var res = from variable in _dc.GetTable<VARIABLE>()
select new { x = variable, y = variable.VARIABLE_VALUEs };
Однако, если я выполняю аналогичный запрос, но перебираю все результаты, выполняется только один запрос к базе данных. Этот код достигает всех целей:
var res = from variable in _dc.GetTable<VARIABLE>()
select variable;
List<GDO.Variable> output = new List<GDO.Variable>();
foreach (var v2 in res)
{
List<GDO.VariableValue> values = new List<GDO.VariableValue>();
foreach (var vv in v2.VARIABLE_VALUEs)
{
values.Add(VariableValue.EntityToGDO(vv));
}
output.Add(EntityToGDO(v2));
output[output.Count - 1].VariableValues = values;
}
Однако последний код выглядит ужасно чертовски, и это действительно похоже на то, что должно быть выполнимо в одном запросе linq.
Итак, как это можно сделать в одном запросе linq, который выполняет только один запрос к базе данных?
В обоих случаях для таблицы задана предварительная загрузка с использованием следующего кода:
_dc = _db.CreateLinqDataContext ();
var loadOptions = new DataLoadOptions();
loadOptions.LoadWith<VARIABLE>(v => v.VARIABLE_VALUEs);
_dc.LoadOptions = loadOptions;
Я использую .NET 3.5, а база данных была сгенерирована с использованием SqlMetal.