development

LINQ 확장 메서드-Any () 대 Where () 대 Exists ()

big-blog 2020. 12. 29. 08:22
반응형

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입니다.

세 번째는 사용 가능한 결과를 반환하지 않으므로 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

반응형