Sharepoint 具有多个查找的复杂查询
我试图获取一个列表中的项,其中任何多个查找值都包含在另一个查询的结果中 情况是这样的:我正在构建一个WebPoint,用户可以使用SharePoint基金会2010个列表为五个属性DROPBOND进行报表合并。属性通过列表中的查找进行连接。每次更改下拉列表选择时,都会发生回发,并重新填充以下下拉列表 问题是,属性之间的连接与下拉列表并不直接匹配。这是因为选择下拉输入是为了直观地输入报告,而datamodel是为了方便直观地输入系统数据而设计的,而不是为了高效简单的编程 数据模型的相关部分: -位置是一个列表 -Contracten contracts是一个列表,每个契约都有一个或多个位置多重查找 -Urgentie紧迫性是一个列表,每个Urgentie都有一个合同查询 -Meldingtypes reporttype是一个列表 -Categorieën categories是一个列表,每个Categorie有一个meldingtype查找,每个Categorie有一个或多个契约多重查找 报告输入如下: 用户首先选择位置 用户第二次选择Meldingtype 用户选择分类第三 用户选择第四个合同 最后用户选择urgenti 当然,每次下拉列表只应填充有效选项。因此,当选择一个位置时,下拉列表中显示的唯一熔接类型应该是那些具有类别的熔接类型,这些类别具有合同,并且具有所选位置……是的,我知道 我在创建用于填充下拉列表的查询时遇到问题。我一直在尝试几种方法,包括多个查询、使用包含选择器构造,但都不起作用。在上一次迭代中,我创建了一个查询,该查询使用一个项在被多重查找引用时所具有的属性。以下是meldingtype下拉列表的示例:Sharepoint 具有多个查找的复杂查询,sharepoint,sharepoint-2010,sharepointfoundation2010,linq-to-sharepoint,Sharepoint,Sharepoint 2010,Sharepointfoundation2010,Linq To Sharepoint,我试图获取一个列表中的项,其中任何多个查找值都包含在另一个查询的结果中 情况是这样的:我正在构建一个WebPoint,用户可以使用SharePoint基金会2010个列表为五个属性DROPBOND进行报表合并。属性通过列表中的查找进行连接。每次更改下拉列表选择时,都会发生回发,并重新填充以下下拉列表 问题是,属性之间的连接与下拉列表并不直接匹配。这是因为选择下拉输入是为了直观地输入报告,而datamodel是为了方便直观地输入系统数据而设计的,而不是为了高效简单的编程 数据模型的相关部分: -位
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()));
}
}
locatieItem和ContractEndData按预期填充,但CategorieEndData再次生成相同的错误。
[/编辑]
另外,因为代码中的荷兰语名称在英语中可读性很强,所以我没有翻译这些名称。抱歉造成混淆。SharePoint 2010中的linq有一些限制。也许这篇文章可以让你走上正轨:我已经解决了这个问题,sortof。它确实会带来一些开销:从数据库中检索的记录太多。但是只有重复项,所以希望缓存能够解决大部分开销 我现在使用的查询非常简单
var categorieenContractenData = from c in contractenData
select c.CategorieënItem;
这并没有给我一组CategorieItems,而是一组CategorieItems,其中一些可以是重复的。然后,我用一个双foreach循环遍历每个条目,并将这些项放在三个数据结构中以便于检索。这意味着要填充三个下拉列表中的每一个,我只需要执行一个linq查询
我预计在本周末数据库中会有一些真实数据,所以我将测试它是否足够快。如果没有,我将不得不额外列出一个由eventreceivers填写的列表
完整代码:
private void ensureLoadData(Intermediair.IntermediairDataContext idctx)
{
if (dataLoaded) return;
meldingtypes = new SortedList<string, int?>();
categorieen = new SortedList<int?,SortedList<string,int?>>();
contracten = new SortedList<int?, SortedList<int?, SortedList<string, int?>>>();
IQueryable<Intermediair.ContractenItem> contractenData = from c in
(from l in idctx.Locaties
where l.Id == selectedLocatieId
select l
).SingleOrDefault().ContractenItem
select c;
var categorieenContractenData = from c in contractenData
select c.CategorieënItem;
foreach (EntitySet<Intermediair.CategorieënItem> categorieenPerContract in categorieenContractenData)
{
foreach (Intermediair.CategorieënItem categorie in categorieenPerContract)
{
if (!meldingtypes.ContainsKey(categorie.Meldingtype.Titel))
{
meldingtypes.Add(categorie.Meldingtype.Titel, categorie.Meldingtype.Id);
categorieen.Add(categorie.Meldingtype.Id, new SortedList<string,int?>());
contracten.Add(categorie.Meldingtype.Id, new SortedList<int?, SortedList<string, int?>>());
}
if (!categorieen[categorie.Meldingtype.Id].ContainsKey(categorie.Titel))
{
categorieen[categorie.Meldingtype.Id].Add(categorie.Titel, categorie.Id);
contracten[categorie.Meldingtype.Id].Add(categorie.Id, new SortedList<string,int?>());
foreach (Intermediair.ContractenItem contract in categorie.Contract)
{
contracten[categorie.Meldingtype.Id][categorie.Id].Add(contract.Titel, contract.Id);
}
}
}
}
dataLoaded = true;
}
谢谢你的想法。但遗憾的是,你的回答对我毫无帮助。本文仅演示如何从联接列中进行选择,而不是如何构造具有多个查找列的where子句。
var categorieenContractenData = from c in contractenData
select c.CategorieënItem;
private void ensureLoadData(Intermediair.IntermediairDataContext idctx)
{
if (dataLoaded) return;
meldingtypes = new SortedList<string, int?>();
categorieen = new SortedList<int?,SortedList<string,int?>>();
contracten = new SortedList<int?, SortedList<int?, SortedList<string, int?>>>();
IQueryable<Intermediair.ContractenItem> contractenData = from c in
(from l in idctx.Locaties
where l.Id == selectedLocatieId
select l
).SingleOrDefault().ContractenItem
select c;
var categorieenContractenData = from c in contractenData
select c.CategorieënItem;
foreach (EntitySet<Intermediair.CategorieënItem> categorieenPerContract in categorieenContractenData)
{
foreach (Intermediair.CategorieënItem categorie in categorieenPerContract)
{
if (!meldingtypes.ContainsKey(categorie.Meldingtype.Titel))
{
meldingtypes.Add(categorie.Meldingtype.Titel, categorie.Meldingtype.Id);
categorieen.Add(categorie.Meldingtype.Id, new SortedList<string,int?>());
contracten.Add(categorie.Meldingtype.Id, new SortedList<int?, SortedList<string, int?>>());
}
if (!categorieen[categorie.Meldingtype.Id].ContainsKey(categorie.Titel))
{
categorieen[categorie.Meldingtype.Id].Add(categorie.Titel, categorie.Id);
contracten[categorie.Meldingtype.Id].Add(categorie.Id, new SortedList<string,int?>());
foreach (Intermediair.ContractenItem contract in categorie.Contract)
{
contracten[categorie.Meldingtype.Id][categorie.Id].Add(contract.Titel, contract.Id);
}
}
}
}
dataLoaded = true;
}