LINQ 확장 메서드-Any () 대 Where () 대 Exists ()
불행히도 이러한 방법의 이름은 검색 용어를 끔찍하게 만들며 각 방법의 차이점을 설명하는 좋은 리소스를 찾을 수 없었습니다.
감사.
편집하다:
내가 완전히 이해하려는 쿼리의 종류는 다음과 같습니다.
context.Authors.Where(a => a.Books.Any(b => b.BookID == bookID)).ToList();
그리고 답변 해주신 모든 분들께 감사드립니다.
Where
조건 자와 일치하는 새 항목 시퀀스를 반환합니다.
Any
부울 값을 반환합니다. 조건자가있는 버전 (이 경우 일치하는 항목이 있는지 여부를 반환)과없는 버전 (이 경우 쿼리에 항목이 포함되어 있는지 여부를 반환 함)이 있습니다.
잘 모르겠습니다 Exists
. LINQ 표준 쿼리 연산자가 아닙니다. Entity Framework에 대한 버전이있는 경우 아마도 키를 기반으로 존재 여부를 확인합니다 Any
. ( 유사 하지만 LINQ 이전 의 Exists
방법 이 있습니다 .)List<T>
Any(predicate)
context.Authors.Where (a => a.Books.Any (b => b.BookID == bookID)). ToList ();
a.Books
해당 저자의 도서 목록입니다. 이 속성은 외래 키 관계가 설정되어있는 경우 Linq-to-Sql에 의해 자동으로 생성됩니다.
따라서 a.Books.Any(b => b.BookID == bookID)
"이 저자의 책 중 bookID의 ID가있는 책이 있습니까?"로 번역되어 "id bookID를 가진 책의 저자는 누구입니까?"라는 완전한 표현이됩니다.
다음과 같이 쓸 수도 있습니다.
from a in context.Authors
join b in context.Books on a.AuthorId equal b.AuthorID
where b.BookID == bookID
select a;
업데이트 : Any()
내가 아는 한 bool
. 효과적인 구현은 다음과 같습니다.
public Any(this IEnumerable<T> coll, Func<T, bool> predicate)
{
foreach(T t in coll)
{
if (predicte(t))
return true;
}
return false;
}
다음에 찾을 수 있도록 열거 가능한 Linq 확장을 검색하는 방법은 다음과 같습니다. 메서드는 Enumerable의 정적 메서드이므로 Enumerable.Any, Enumerable.Where 및 Enumerable.Exists입니다.
- google.com/search?q=Enumerable.Any
- google.com/search?q=Enumerable.Where
-
google.com/search?q=Enumerable.Exists
세 번째는 사용 가능한 결과를 반환하지 않으므로 List.Exists를 의미하므로 다음과 같습니다.
또한 추천 hookedonlinq.com 이 매우 포괄적이고 명확한 가이드가 그대로 deferness 및 lazyness 관련의 LINQ 방법의 동작을 잘 명확한 설명으로,.
Any-목록의 객체가 함수 매개 변수에 설정된 조건을 충족하는 경우 true를 반환하는 부울 함수입니다. 예를 들면 :
List<string> strings = LoadList();
boolean hasNonEmptyObject = strings.Any(s=>string.IsNullOrEmpty(s));
Where-함수 매개 변수에 설정된 조건을 만족하는 목록의 모든 개체가있는 목록을 반환하는 함수입니다. 예를 들면 :
IEnumerable<string> nonEmptyStrings = strings.Where(s=> !string.IsNullOrEmpty(s));
Exists-기본적으로 any와 동일하지만 일반적이지 않습니다. List 클래스에 정의되어 있고 Any는 IEnumerable 인터페이스에 정의되어 있습니다.
IEnumerable은 자신의 델리게이트를 전달하고 IEnumerable에서 결과를 호출하는 데 도움이되는 많은 확장을 도입합니다. 대부분은 본질적으로 Func 유형입니다.
Func는 인수 T를 취하고 TResult를 반환합니다.
의 경우
Where-Func : 따라서 T의 IEnumerable을 사용하고 bool을 반환합니다. Where will 궁극적으로 Func가 true를 반환하는 T의 IEnumerable을 반환합니다.
따라서 IEnumerable로 1,5,3,6,7이 있고 .where (r => r <5)라고 작성하면 새로운 IEnumerable 1,3이 반환됩니다.
Any-Func는 기본적으로 서명이 비슷하지만 IEnumerable에 대해 어떤 기준이 true를 반환하는 경우에만 true를 반환합니다. 우리의 경우 r <5 인 요소가 거의 없으므로 true를 반환합니다.
Exists-반면 술어는 술어 중 하나가 true를 리턴하는 경우에만 true를 리턴합니다. 따라서 우리의 경우 .Exists (r => 5)를 전달하면 5가 IEnumerable에 존재하는 요소이므로 true를 반환합니다.
Any ()는 컬렉션의 요소가 술어의 기준을 충족하는 경우 true를 반환합니다.
Where ()는 술어의 기준을 충족하는 컬렉션의 모든 요소를 열거 할 수있는 항목을 반환합니다.
Exists ()는 Linq 이전에 IList에 있던 이전 구현이라는 점을 제외하고는 다른 것과 동일합니다.
foreach (var item in model.Where(x => !model2.Any(y => y.ID == x.ID)).ToList())
{
enter code here
}
same work you also can do with Contains
secondly Where
is give you new list of values. thirdly using Exist
is not a good practice, you can achieve your target from Any
and contains
like
EmployeeDetail _E = Db.EmployeeDetails.where(x=>x.Id==1).FirstOrDefault();
Hope this will clear your confusion.
ReferenceURL : https://stackoverflow.com/questions/3703256/linq-extension-methods-any-vs-where-vs-exists
'development' 카테고리의 다른 글
URL의 URL 인코딩 슬래시 (0) | 2020.12.29 |
---|---|
Ruby의 동일한 디렉토리에 파일을 요구하는 더 짧은 방법이 있습니까? (0) | 2020.12.29 |
sbt / play에 대해 컬러 터미널 출력을 비활성화하려면 어떻게해야합니까? (0) | 2020.12.29 |
UITableViewCell 배경색이 작동하지 않는 이유는 무엇입니까 (인터페이스 빌더에서 설정)? (0) | 2020.12.29 |
Dapper는 like 연산자를 지원합니까? (0) | 2020.12.29 |