2012-02-29 123 views
3

所以我通过我的希望的数据库的一个简单的例子,它具有以下表工作:Simple.Data许多对许多问题

Contractors: Id, ContractorName 
Types: Id, TypeName 
CoverageZips: ContractorId, Zip 
TypesForContractors: ContractorId, TypeId 

其中承包商可以有很多拉链和类型和类型拉链可以有很多承包商(多对多)。

我想:

  1. 做承包商搜索某一邮政编码
  2. 然后装入类型的承包商。

的第一部分中的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,当我试试我的方法不止一次

回答

5

我不奇怪的事情正在发生不知道这个例外发生了什么,今天将进行调查。

虽然你错过了一些美丽。假设你有你的数据库配置引用完整性(这当然你做;)),你的方法可以写成这样:

public dynamic GetAllForZip(int zip) { 
    var contractors = _db.Contractors 
     .FindAll(_db.Contractors.ContractorZips.Zip == zip) 
     .ToList(); 

    foreach (var contractor in contractors) { 
     contractor.Types = GetTypesForContractor((int)contractor.Id); 
    } 
    return contractors; 
} 

public dynamic GetTypesForContractor(int id) { 
    return _db.ContractorTypes 
     .FindAll(_db.ContractorTypes.TypesForContractor.ContractorId == id) 
     .ToList(); 
} 

更新!

随着1.0.0-β3,渴望加载在许多一对多联接是支持的,所以现在你可以这样做:

public dynamic GetAllForZip(int zip) { 
    return _db.Contractors 
     .FindAll(_db.Contractors.ContractorZips.Zip == zip) 
     .With(_db.Contractors.TypesForContractor.ContractorTypes.As("Types")) 
     .ToList(); 
} 

和执行作为一个单一的SQL选择,让您的DBA像彩虹小猫一样快乐。

+0

开发人员被宠坏了;图书馆开发者的回应?!真棒。我觉得有一个很好的方法来做到这一点,但我不能相信这是多么美丽。您的解决方案完美地工作,但我仍然在检索到多个记录时遇到异常。由于我是StackOverflow的新手,有没有一些礼节能让我发布更详细的信息来尝试并放大这个问题? – 2012-03-01 21:57:55

+0

如果你仍然有问题,最好的地方是http://github.com/markrendle/simple.data/issues – 2012-03-02 13:37:35

+0

另外,请确保你使用的是最新的1.0.0-beta版本通过在软件包管理器控制台上使用-pre标志进行安装。 – 2012-03-02 13:43:05