해결 방법을 찾았을 때 실제 질문보다 명확한 질문이 더 많습니다. 난 그냥 SQLite는 그물이sqlite-net의 FirstOrDefault()와 Where() 사이의 의미 차이
2.1 나는 .FirstOrDefault(lambda)
을 실행에 .Where(lambda).FirstOrDefault()
를 실행 사이에 뚜렷한 차이를 볼 사용 SQLLite 3.8.3.1을 사용하여 ...
추론을 이해하지 않습니다.
Linq에 대한 제 경험으로 보면 데이터베이스 LINQ 제공자는 본질적으로 동일한 두 가지를 모두 처리합니다 (.FirstOrDefault(lambda)
). 적절하게 최적화 된 경우 조금 더 빠르지 만,이 두 호출은 대략 동일한 시간이 걸릴 것입니다 실행).
그러나, SQLite는-NET에서, 나는 그것에 ~ 40,000 레코드가 테이블에 다음과 같은 결과를보고하고있다 :
이.FirstOrDefault(x => x.Id == id)
를 실행, 나는 코어-I7에 복용 시간을보고하고하는 것은 사이에 2200ms ~ 3700ms. 표면 RT (1 세대)에이 사실
.Where(x => x.Id == id).FirstOrDefault()
를 실행, 나는 16ms - 20ms의 사이 동일한 코어-I7에 복용 시간을보고 있어요 .. 주위에 소요-30,000ms을 20,000ms. 표면 RT에서 이것은 약 30ms가 걸립니다.
내 질문은 이것이 버그인지 또는 의식적인 디자인 결정인지 여부입니다. 디자인 결정이라면 그 배후에있는 추론을 이해하고 싶습니다.
두 가지 방법 간에는 의미상의 차이가 없으므로 단순한 쿼리로 인해 100-1000 배의 시간이 소요될 수 있습니다. 그러나 더 많은 정보가 없으면 추가 결론을 내리기가 어렵습니다. 각 쿼리에서 생성되는 SQL은 무엇입니까? 벤치 마크 테스트는 어떻게 구성되어 있습니까? 데이터베이스에있는 항목 수와 어떤 종류의 인덱스가 있습니까? 등등. – StriplingWarrior
여기 좀 봐 http://stackoverflow.com/questions/11661319/linq-wherepredicate-vs-firstordefaultpredicate – Christos
@ChristosPaisios : 이것은 실제로 적용되지 않습니다. Sqlite-net은 한 가지 방법과 다른 방법을 구현하는 테이블 개체를 반환합니다. –