我正在尝试获取一个列表的项目,其中任何多重查找值都包含在另一个查询的结果中。
情况是这样的:我正在构建一个 web 部件,用户可以使用它使用一组共享点(foundation 2010)列表为五个属性下拉列表制作报告(“融合”)。这些属性通过列表中的查找进行连接。每次更改下拉选择时,都会发生回发并重新填充以下下拉列表。
问题是属性之间的连接不是与下拉列表的直接匹配。这是因为下拉输入被选择用于报表的直观输入,并且数据模型被设计为系统数据的简单和直观输入,而不是为了高效和简单的编程......
数据模型的相关部分:
-Locaties(位置)是一个列表 -Contracten
(合同)是一个列表,每个合同都有一个或多个位置(多查找)
-Urgentie(紧急度)是一个列表,每个紧急有一个合同(lookup)
-Meldingtypes (reporttype) 是一个列表 -Categorieën
(categories) 是一个列表,每个类别有一个 meldingtype (lookup),每个类别有一个或多个合约 (multi-lookup)
报告输入如下:
用户首先选择Locatie
用户选择Meldingtype 第二
用户选择Categorie 第三
用户选择Contract 第四
最后用户选择Urgentie
当然,每次下拉菜单都应该只填充有效的选项。So when a location is chosen, the only meldingtypes shown in the dropdown should be the ones that have categories which have a contract which have the chosen location...yeah, I know ;)
我在创建查询以填充下拉列表时遇到问题。我一直在尝试几种方法,包括多个查询、使用 Contains 选择器的构造,但都没有奏效。在上一次迭代中,我创建了一个查询,该查询使用一个项目在被多重查找引用时所具有的属性。这是 meldingtype 下拉列表的示例:
private void fillMeldingtypeDropdown(Intermediair.IntermediairDataContext idctx)
{
var meldingtypeData = (from l in idctx.Locaties
from co in l.ContractenItem
from ca in co.CategorieënItem
where l.Id == selectedLocatieId
select ca.Meldingtype
).Distinct<Intermediair.Item>();
foreach (Intermediair.Item meldingtype in meldingtypeData)
{
ctrl_Meldingtype.Items.Add(new ListItem(meldingtype.Titel, meldingtype.Id.ToString()));
}
}
selectedLocatieId 是一个从 Locatie 下拉控件中获取值的属性。
上面的代码会引发 System.InvalidOperationException。错误描述是荷兰语,翻译成类似:“查询使用不受支持的元素,例如对多个列表的引用或使用 EntityRef/EntitySet 投影完整实体”
如果我使用 EntitySet.Contains,我会得到同样的错误:
private void fillCategorieDropdown(Intermediair.IntermediairDataContext idctx)
{
var contractenData = from c in idctx.Contracten
where c.LocatieS.Contains(
( from l in idctx.Locaties
where l.Id == selectedLocatieId
select l
).First<Intermediair.LocatiesItem>()
)
select c;
var categorieenData = ( from ca in idctx.Categorieën
from co in contractenData
where ca.Contract.Contains(co) && ca.Meldingtype.Id == selectedMeldingtypeId
select ca
).Distinct<Intermediair.CategorieënItem>();
foreach (var categorie in categorieenData)
{
ctrl_Categorie.Items.Add(new ListItem(categorie.Titel, categorie.Id.ToString()));
}
}
我尝试了几种排列,但似乎找不到合适的排列。对于具有多查找字段的 linq-to-sharepoint 查询,我找不到任何好的示例,而且我对 linq 还不够熟练,所以我可能会犯一些市长错误。虽然我正在弄清楚这一点,但我真的很感激任何有用的想法。
[编辑:另一次尝试失败] 我尝试对所有步骤进行单独查询以检查中间结果。我还尝试了 Any-Contains 组合,以将类别的多查找合同与我从该位置获得的多个合同相匹配。
var locatieItem = (from l in idctx.Locaties
where l.Id == selectedLocatieId
select l
).First();
var contractenData = from c in locatieItem.ContractenItem
select c;
var categorieenData = from c in idctx.Categorieën
where c.Contract.Any(co => contractenData.Contains(co))
select c;
var meldingtypeData = (from c in categorieenData
select c.Meldingtype
).Distinct();
foreach (var meldingtype in meldingtypeData)
{
ctrl_Meldingtype.Items.Add(new ListItem(meldingtype.Titel, meldingtype.Id.ToString()));
}
locatieItem 和 contractenData 已按预期填充,但 categorieenData 再次生成相同的错误。[/编辑]
PS因为代码中的荷兰名字在英文中非常易读,所以我没有翻译名字。对困惑感到抱歉。