2013-04-23 4 views
1

Я новичок в linq, и я пишу процесс, который, я считаю, можно улучшить.LINQ - выберите из db и сравните два списка

Чтобы сделать это простым:
Я получаю список объектов.
Я проверяю таблицу db, у объекта есть строка в базе данных.
Я возвращаю список объектов с дополнительным булевым существует/не существует.

У меня есть следующий простого POCO

public class Project 
{ 
    public Guid? Id {get; set;} 
    public string name {get; set;} 
} 

Уведомление не всегда у меня есть идентификатор, и для этого я должен пропустить этот объект.
(странно, но это только очень близко к моему требованию в RealLife)

Вот мой код - нуждаются в улучшении:

// Get List OF Project Guids 
List<Project> ProjectList = GetProjects() 
IEnumerable<Guid?> projectsIDs = from package in packages select package.Key; 
List<Guid?> prjGuidsList = projectsIDs.ToList(); 

// Sends the list of Guids and return only the one that exists in the db 
// will be implemented with select.. where.. in.. 
List<Guid?> dbProjects = FilterSharedVersions(prjGuidsList); 


// create a new object that will contain the true false value 
List<ProjectsToken> tokens = packages.Select(subject => new ProjectsToken 
{ 
    Id = subject.id 
    MetaKey = subject.Name, 
    exists = dbProjects.contains(subjecy.id) 
}  
).ToList(); 

return tokens; 

ответ

3

Метод класса List Contains будет выполнять очень плохо в O (п). Вместо этого вам нужно построить HashSet, тогда метод Contains будет выполнять в O (1).

var dbProjects = new HashSet<Guid?>(FilterSharedVersions(prjGuidsList)); 
var tokens = packages.Select(subject => new ProjectsToken 
{ 
    Id = subject.id 
    MetaKey = subject.Name, 
    exists = dbProjects.Contains(subjecy.id) 
}  
).ToList(); 
+0

yepp, Это хорошая записка. не связанный с linq, но важный. – Jeb

+0

@rails: Я не вижу никаких вопросов, поэтому я старался изо всех сил, чтобы помочь вам :) –

Смежные вопросы