2014-12-11 1 views
0

나는 수천 개의 객체를 반복하여 특정 id를 가진 올바른 것을 찾는 내 프로그램 안에 루프를 가지고있다. 가이이 LINQ를 더 빨리 수행 할 수 있습니까?

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; 
    } 
} 
+0

일부 코드를 놓친 것 같습니다. –

+0

나는 루프의 코드 부분 만 보여 주었다. 루프 내부에서 일어나는 일은 중요하지 않습니다. – user388969

+0

아마 당신은 당신의 콜렉션에서 하나의 아이템을 찾고 싶다면'var item = _dataitems.FirstOrDefault (r => r.ID == id);'를 사용하십시오. 참조 : http://stackoverflow.com/questions/12477422/how-to-use-returned-linq-variable/12477454#12477454 – Habib

답변

4

사용 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를 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(); 
} 
+0

은 foreach 루프 나 위에있는 코드보다 빠릅니다. 목록에 ID가없는 경우에는 어떻게됩니까? 이 예외가 throw됩니다 ?? – user388969

+1

* 빠를 것입니다 * 빠릅니다. – Servy

+0

@ user388969 ID가 없다면 코드를 던지면 안되면 ID 필드와 ID를 비교하는 CAML 쿼리를 작성하고 목록에 대해 해당 쿼리를 실행하면된다. GetItemById'는 내부적으로 할 것입니다. – Servy

0

목록이 정렬되어 있는지 확인하십시오. 그런 다음 목록의 BinarySearch 메서드를 사용하거나 직접 implementation을 작성할 수 있습니다. 그렇지 않으면 linq를 사용하여 코드를 단축 할 수 있습니다.

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

그래서 ID를 가진 항목에 대한 데이터베이스를 쿼리하는 대신 전체 테이블의 가치있는 데이터를 데이터베이스에서 메모리로 가져 와서 전체를 정렬 한 다음 ID를 찾기 위해 검색하는 것이 좋습니다. ? – Servy

+0

아니요 - 다른 옵션이없는 경우에만 ... 그러나 셰어 포인트이므로 ID에 직접 qry 할 수있는 나머지 인터페이스가 있으므로 필요가 없습니다. 답안에 표시된대로. – Jessica

+0

특정 ID로 목록 항목을 찾고 있는데 35 개의 열이 더 있습니다. 모든 열의 데이터를 가져와 출력으로 인쇄해야합니다. 나는 네가 n 개의 아이템이라면 각 루프가 모든 아이템을 반복 할 것이라고 생각했다. 그래서 성능 측면에서보다 빠른 방법을 찾고있었습니다. – user388969

관련 문제