3
所以我通过我的希望的数据库的一个简单的例子,它具有以下表工作:Simple.Data许多对许多问题
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;
}
我设置一个断点,一切正常,第一次迭代显示,但第二次失败,但有以下例外:
索引超出范围。必须是非负数且小于集合的大小。
TL;博士
我不知道如何正确使用许多一对多的关系,与Simple.Data,当我试试我的方法不止一次
开发人员被宠坏了;图书馆开发者的回应?!真棒。我觉得有一个很好的方法来做到这一点,但我不能相信这是多么美丽。您的解决方案完美地工作,但我仍然在检索到多个记录时遇到异常。由于我是StackOverflow的新手,有没有一些礼节能让我发布更详细的信息来尝试并放大这个问题? – 2012-03-01 21:57:55
如果你仍然有问题,最好的地方是http://github.com/markrendle/simple.data/issues – 2012-03-02 13:37:35
另外,请确保你使用的是最新的1.0.0-beta版本通过在软件包管理器控制台上使用-pre标志进行安装。 – 2012-03-02 13:43:05