Итак, я работаю над упрощенным примером моей ожидаемой базы данных, которая имеет следующие таблицы:
Contractors: Id, ContractorName
Types: Id, TypeName
CoverageZips: ContractorId, Zip
TypesForContractors: ContractorId, TypeId
, где у подрядчиков может быть много почтовых индексов, типов и типов, а у почтовых индексов может быть много подрядчиков (многие ко многим).
Я пытаюсь:
- выполнить поиск подрядчиков по определенному почтовому индексу
- , а затем загрузить типы для этихподрядчики.
SQL для первой части, вероятно, будет выглядеть так:
SELECT * FROM dbo.Contractors WHERE Id IN
(SELECT ContractorId FROM dbo.CoverageZips WHERE Zip = 12345)
Вот то, что у меня есть для первой части в Simple.Data.Это работает, но я чувствую, что мне не хватает всей красоты Simple.Data ...
List<int> contractorIds = new List<int>();
foreach(var coverage in _db.CoverageZips.FindAllByZip(zip)) {
contractorIds.Add((int)coverage.ContractorId);
}
var contractors = new List<dynamic>();
if (contractorIds.Count > 0) {
contractors = _db.Contractors.FindAllById(contractorIds).ToList<dynamic>();
}
return contractors;
Это работает нормально, пока я не попробую часть 2:
public dynamic GetAllForZip(int zip) {
List<int> contractorIds = new List<int>();
foreach(var coverage in _db.CoverageZips.FindAllByZip(zip)) {
contractorIds.Add((int)coverage.ContractorId);
}
var contractors = new List<dynamic>();
if (contractorIds.Count > 0) {
contractors = _db.Contractors.FindAllById(contractorIds).ToList<dynamic>();
}
foreach (var contractor in contractors) {
// Exception occurs here on second iteration
// even though the second contractor was originally in the contractors variable
contractor.types = GetTypesForContractor((int)contractor.Id);
}
return contractors;
}
public dynamic GetTypesForContractor(int id) {
var types = new List<dynamic>();
if (id > 0) {
List<int> typeIds = new List<int>();
foreach (var typeForContractor in _db.TypesForContractor.FindAllByContractorId(id)) {
typeIds.Add((int)typeForContractor.TypeId);
}
if (typeIds.Count > 0) {
types = _db.ContractorTypes.FindAllById(typeIds).ToList<dynamic>();
}
}
return types;
}
Iустановите точку останова, и все работает нормально для первого показа итерации, но завершается сбоем на втором со следующим исключением:
Индекс был вне диапазона.Должен быть неотрицательным и меньше размера коллекции.
tl; dr
Я не уверен, как правильно использовать отношения многие ко многим с Simple.Data и чем-то подобнымстранно происходит, когда я пробую свой метод более одного раза