2013-04-23 2 views
1

저는 linq을 처음 사용하며 개선 될 수 있다고 생각되는 프로세스를 작성 중입니다.LINQ - db에서 선택하고 두 목록을 비교하십시오.

간단하게 :
개체 목록을 얻습니다.
개체에 데이터베이스가있는 db 테이블을 체크 인합니다.
aditional boolean이있는 객체 목록을 반환합니다. 존재하지 않습니다.

은 내가 ID를 가지고 및 그 난이 객체를 건너 뛰어야 항상 다음과 같은 간단한 POCO

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

주의 사항이있다.

// 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 방법은 N (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 : 질문이 없으므로 최대한 열심히 노력했습니다. :) –

관련 문제