2009-08-11 2 views
10

저는 LINQ와 LINQ to SQL을 처음 사용 했으므로이 코드의 문제점을 이해하지 못했습니다. Excetpion.Message 내가 얻을 수있다.NET : LINQ의 Last()

"쿼리 연산자 '마지막'지원되지 않습니다."

제가 시도하려는 것은 가장 최신의 LastActivityUtc을 얻는 것입니다. 코드는 다음과 같습니다. 다음

var postTimes = from post in db.Post 
       where post.LastActivityUtc != null 
       orderby post.LastActivityUtc descending 
       select post.LastActivityUtc; 

DateTime startDate = DateTime.MinValue; 

if (postTimes.Count() >= 2) 
{ 
    startDate = postTimes.Take(100).Last().Value; 
} 

답변

20

브랜든 에게 솔루션을 올렸습니다,하지만 메모리의 전체 목록을 복사 필요합니다. 그냥, 당신이 AsEnumerable 사용할 수있는 프로세스에 대한 데이터베이스 쿼리에서 "전환"할 경우

:

startDate = postTimes.Take(100).AsEnumerable().Last().Value; 

이, 당신이 가능 수행했다 가졌 이전 ToList()를 호출하기를 원하지만 - 마지막 값에 대해 한 번씩 카운트 한 번 쿼리를 실행하는 것을 방지하고,하기 :

var postTimes = (from post in db.Post 
       where post.LastActivityUtc != null 
       orderby post.LastActivityUtc descending 
       select post.LastActivityUtc).Take(100).ToList(); 

DateTime startDate = DateTime.MinValue; 

if (postTimes.Count >= 2) 
{ 
    startDate = postTimes.Last().Value; 
} 

데이터베이스 쿼리 을 실행하지만, 단지를 가져올 것이다 처음 100 개의 레코드를 메모리에 저장합니다. 물론 다른 곳에서 postTimes을 사용하려고하면 다소 떨어집니다 ...

+1

쥐, 명백하게, 나의 최초의 대답은 전혀 어리 석다! 나는 그것을 Marc에게 비난했다.) –

+0

@Mehrdad - 나는 겸손하게 책임을진다! – Marc

+2

누가 더 어리석은가요? 바보, 또는 그를 따르는 바보? –

4
postTimes에

전화 .ToList()와 .Last를 사용해보십시오()

startDate = postTimes.Take(100).ToList().Last().Value; 
+1

이것은 언급 한 이유로 작동하지 않을 수 있습니다. '.ToList()'대신'.AsEnumerable()'도 사용할 수 있습니다. 이 두 가지 이유는 표현식을 SQL로 변환하려고하지 않기 때문입니다. 그들은 단지 100 개의 행을 가져 와서 클라이언트에서 처리합니다. –

+0

내 실수는, 내 대답의 그 부분을 제거합니다. – Brandon