Tim*_*all 3 many-to-many asp.net-mvc-3 simple.data
所以我正在研究我希望的数据库的简化示例,该数据库包含以下表格:
Contractors: Id, ContractorName
Types: Id, TypeName
CoverageZips: ContractorId, Zip
TypesForContractors: ContractorId, TypeId
Run Code Online (Sandbox Code Playgroud)
承包商可以拥有许多拉链和类型和类型,拉链可以有许多承包商(多对多).
我试着:
第一部分的SQL可能如下所示:
SELECT * FROM dbo.Contractors WHERE Id IN
(SELECT ContractorId FROM dbo.CoverageZips WHERE Zip = 12345)
Run Code Online (Sandbox Code Playgroud)
这是我在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;
Run Code Online (Sandbox Code Playgroud)
这是正常的,直到我尝试第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;
}
Run Code Online (Sandbox Code Playgroud)
我设置了一个断点,一切正常,第一次迭代显示,但在第二次失败时出现以下异常:
指数超出范围.必须是非负数且小于集合的大小.
TL;博士
我不确定如何正确使用与Simple.Data的多对多关系,当我不止一次尝试我的方法时会发生一些奇怪的事情
我不知道该例外发生了什么,今天将进行调查.
但是你错过了一些美.假设您在数据库上配置了参照完整性(当然可以这样做;)),您的方法可以这样编写:
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();
}
Run Code Online (Sandbox Code Playgroud)
更新!
从1.0.0-beta3开始,支持多对多连接的急切加载,所以现在你可以这样做:
public dynamic GetAllForZip(int zip) {
return _db.Contractors
.FindAll(_db.Contractors.ContractorZips.Zip == zip)
.With(_db.Contractors.TypesForContractor.ContractorTypes.As("Types"))
.ToList();
}
Run Code Online (Sandbox Code Playgroud)
并且它作为单个SQL选择执行,使您的DBA像彩虹小猫一样快乐.
归档时间: |
|
查看次数: |
902 次 |
最近记录: |