Sharepoint 具有多个查找的复杂查询

Sharepoint 具有多个查找的复杂查询,sharepoint,sharepoint-2010,sharepointfoundation2010,linq-to-sharepoint,Sharepoint,Sharepoint 2010,Sharepointfoundation2010,Linq To Sharepoint,我试图获取一个列表中的项,其中任何多个查找值都包含在另一个查询的结果中 情况是这样的:我正在构建一个WebPoint,用户可以使用SharePoint基金会2010个列表为五个属性DROPBOND进行报表合并。属性通过列表中的查找进行连接。每次更改下拉列表选择时,都会发生回发,并重新填充以下下拉列表 问题是,属性之间的连接与下拉列表并不直接匹配。这是因为选择下拉输入是为了直观地输入报告,而datamodel是为了方便直观地输入系统数据而设计的,而不是为了高效简单的编程 数据模型的相关部分: -位

我试图获取一个列表中的项,其中任何多个查找值都包含在另一个查询的结果中

情况是这样的:我正在构建一个WebPoint,用户可以使用SharePoint基金会2010个列表为五个属性DROPBOND进行报表合并。属性通过列表中的查找进行连接。每次更改下拉列表选择时,都会发生回发,并重新填充以下下拉列表

问题是,属性之间的连接与下拉列表并不直接匹配。这是因为选择下拉输入是为了直观地输入报告,而datamodel是为了方便直观地输入系统数据而设计的,而不是为了高效简单的编程

数据模型的相关部分: -位置是一个列表 -Contracten contracts是一个列表,每个契约都有一个或多个位置多重查找 -Urgentie紧迫性是一个列表,每个Urgentie都有一个合同查询 -Meldingtypes reporttype是一个列表 -Categorieën categories是一个列表,每个Categorie有一个meldingtype查找,每个Categorie有一个或多个契约多重查找

报告输入如下: 用户首先选择位置 用户第二次选择Meldingtype 用户选择分类第三 用户选择第四个合同 最后用户选择urgenti

当然,每次下拉列表只应填充有效选项。因此,当选择一个位置时,下拉列表中显示的唯一熔接类型应该是那些具有类别的熔接类型,这些类别具有合同,并且具有所选位置……是的,我知道

我在创建用于填充下拉列表的查询时遇到问题。我一直在尝试几种方法,包括多个查询、使用包含选择器构造,但都不起作用。在上一次迭代中,我创建了一个查询,该查询使用一个项在被多重查找引用时所具有的属性。以下是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()));
        }
    }
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;
    }