2010-01-22 3 views
0

현재이 쿼리를 재사용 할 수있는 짧은 코드로이 쿼리를 게시하려고 할 때 게시물을 확인하려고합니다."SQL에서 지원되는 번역이 없습니다"Linq 해결 방법은 무엇입니까?

// Logic to check if post is eligible for display 
    public bool isEligibleForDisplay(Post n) 
    { 
     var pubDate = n.PUBLISH_DATE ?? DateTime.MinValue; 
     var endDate = n.END_DATE ?? DateTime.MaxValue; 
     var correctState = (n.STATE == PostState.Publish || n.STATE == PostState.Furture); 
     var dateInRange = (DateTime.Now >= pubDate && DateTime.Now <= endDate); 
     return correctState && dateInRange; 
    } 

내 LINQ는 다음과 같다 :

var q = from n in _db.Posts 
        where isEligibleForDisplay(n) 
        group n by n.POST_ID into g 
        select g.OrderByDescending(t => t.CREATE_DATE).First(); 
      return q.Take(quantity); 

내가 SQL에 LINQ를 사용하여 처음 문제 "SQL에서 지원되는 번역"로 실행, 난 그냥 궁금를 어쨌든이있는 경우 이 사건에 대한 해결책으로 사용할 수 있는데, 매번 논리를 검사하는 논리를 전체 쿼리에 포함 시키면 골칫거리가 될 수 있습니다.

나는 회신을 고대하고 있습니다. 감사!

+0

닫기를 선택하지 마십시오. 다른 하나 (http://stackoverflow.com/questions/2115656/no-supported-translation-in-sql-linq-workaround)는 "duplicate"가 약간 나중에 게시되었습니다. –

+0

감사합니다. 중복 된 게시물에 대해 미안합니다. – DucDigital

+0

당면한 문제에 직각이지만, PUBLISH_DATE 세트가있는 게시물을 1 초 동안 만 게시하고 싶습니다 (설정되어있는 경우 시작일과 종료일로 모두 사용되기 때문에). –

답변

2

이러한 검사의 SQL 등가성을 수행하는 isEligibleForDisplay이라는 SQL 서버에서 함수를 작성하여 dbml 파일에 추가 할 수 있습니다.

나는이 테스트를하지 않은,하지만 난 당신이 아니라 전체 기록보다, 원하는 값을 전달하는 함수를 작성하면 될 것이다 가장 쉬운을 생각하고, 나는 이런 식으로 뭔가가 작동하지 않을 수 있습니다 생각 :

CREATE FUNCTION isEligibleForDisplay(
    @publishDate DATETIME, 
    @endDate DATETIME, 
    @state TINYINT -- correct me if i'm wrong... 
) RETURNS bit 

AS 

BEGIN 

    DECLARE @return bit 
    DECLARE @dateStart DATETIME, @dateEnd DATETIME 

    SET @return = 0 

    SET @dateStar t= COALESCE(@publishDate, CONVERT(DATETIME, '1900-01-01')) 
    SET @dateEnd = COALESCE(@endDate, CONVERT(DATETIME, '9999-12-31')) 

    IF getdate() BETWEEN @dateStart AND @dateEnd 
    BEGIN 

     IF @state IN(1,3) -- or whatever the int representations of your enum are 
      SET @return = 1 

    END 


    RETURN @return 

END 
+0

이 솔루션은 잘 작동하지만 잘 나타납니다. mssql 함수를 사용하지 않고 다른 솔루션을 사용하여 아래의 내 응답을 확인하십시오. – DucDigital

0

maqny 레코드가 _db.Posts에있는 방법은 무엇입니까? 많지 않다면 .ToList()를 먼저 수행하고 linq가 isEligibleForDisplay 함수를 사용할 수 있습니다.

+0

레코드가 많이 올라갈 수 있으므로 해결책이 아닙니다 :) – DucDigital

1

linq 확장을 사용하여 IQueryable을 사용하여 실제로 매우 잘 작동 할 수있는 메서드를 포함했습니다.

public static IQueryable<T> getPostActive<T>(this IQueryable<T> items) where T : P015.Models.SQLModel.Post 
{ 
    // Logic to check if post is eligible for display 
    var now = DateTime.Now; 
    return items.Where(n => 
          (n.STATE.Trim() == PostState.Publish || n.STATE.Trim() == PostState.Furture || n.STATE.Trim() == PostState.Draft) && 
          (
           ((n.END_DATE ?? SqlDateTime.MaxValue.Value) >= now) && 
           ((n.PUBLISH_DATE ?? SqlDateTime.MinValue.Value) <= now) 
          ) 
        ); 
} 
관련 문제