【问题标题】:Is there a faster way to do this LINQ?有没有更快的方法来做这个 LINQ?
【发布时间】:2015-02-10 05:38:08
【问题描述】:

我的程序中有一个循环,它遍历数千个对象以找到具有特定 ID 的正确对象。 还有比这个更好更快的方法吗

int id;
SPList list = SPContext.Current.Web.Lists.TryGetList("DataLibrary");
IEnumerable<SPListItem> _dataitems = list.Items.OfType<SPListItem>();

foreach (SPListItem item in _dataextantitems)
{
    if (item.ID == id)
    {
        title= item.Title;
    }
}

【问题讨论】:

  • 我认为你遗漏了一些代码。
  • 我只展示了循环的部分代码。我猜循环内部发生的事情并不重要。
  • 也许您正在寻找从您的收藏中找到一件单品,请使用var item = _dataitems.FirstOrDefault(r=&gt; r.ID == id);。见:stackoverflow.com/questions/12477422/…
  • @DimitarDimitrov 局部变量在分配之前不能使用;除非他为其分配值,否则代码不会编译。大概生成 ID 的代码与我们无关。
  • @Servy :P 是的,你当然是对的 :) 我的错。

标签: c# linq sharepoint foreach sharepoint-2010


【解决方案1】:

使用SPListGetItemById

var title = SPContext.Current.Web.Lists["DataLibrary"].GetItemById(id).Title;

如果您的列表有很多列,并且您想避免将它们全部拉下,您可以拉下 只是Title 列:

var title = SPContext.Current.Web.Lists["DataLibrary"]
    .GetItemByIdSelectedFields(id, "Title").Title;

现在,如果您真的想在这里使用 LINQ,您可以使用 LINQ to Sharepoint,但它实际上并不会大大简化代码。使用 SPMetal.exe 根据您的列表生成文件后,您可以编写:

using(var context = new YourContextNameHere(SPContext.Current.Site.Url))
{
    var title = context.DataLibrary
        .Where(item => item.ID == id)
        .Select(item => item.Title)//to avoid pulling down other columns
        .First();
}

【讨论】:

  • 它是否比 foreach 循环或我上面的代码快,如果列表中不存在 id 怎么办。这会抛出异常吗??
  • 它会显着更快。
  • @user388969 如果您需要您的代码在 ID 不存在的情况下不抛出,那么您需要编写一个 CAML 查询,将 ID 字段与您拥有的 ID 进行比较,然后执行该查询列表,这就是 GetItemById 在幕后要做的事情。
【解决方案2】:

确保您的列表已排序。然后你可以使用列表的 BinarySearch 方法或编写你自己的implementation。如果没有,您可以使用 linq 缩短代码。

var itemToLookup = list.Items.OfType<SPListItem>().FirstOrDefault(x => x.ID == id);
if (itemToLookup != null)
{
      //...
}

【讨论】:

  • 所以你建议他将整个表的数据从数据库中拉到内存中,对整个数据进行排序,然后搜索它以找到 ID,而不是仅仅查询具有该 ID 的项目的数据库?
  • 没有--只有在没有其他选择的情况下...但是由于它是sharepoint,并且有一个可以让您直接在ID上查询的rest接口,因此不需要它。如您的回答所示。
  • 我找到了具有特定 id 的列表项,然后我还有 35 列。我需要获取所有列的数据并在输出中打印。我认为对于每个循环都会遍历所有项目,如果你是 n 个项目,它将有 n 个循环。所以在性能方面寻找一种更快的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多