2010-01-22 35 views
0

當前即時通訊設法使我的查詢短與這樣的代碼可重用peice檢查後,如果它有資格顯示。「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); 

我跑進了使用LINQ to SQL的第一時間問題「在SQL不支持翻譯」,我只是想知道是否有反正可以用作這種情況的解決方法,如果每次將大量這些檢查邏輯包含到查詢中,這可能會很麻煩。

我很期待回覆。謝謝!

+0

請不要投票結束這件事。另一個(http://stackoverflow.com/questions/2115656/no-supported-translation-in-sql-linq-workaround)是稍後發佈的「重複」。 – 2010-01-22 07:19:11

+0

謝謝。對不起,重複的帖子 – DucDigital 2010-01-22 07:32:28

+0

正交於手頭的問題,但是您確定要設置PUBLISH_DATE的帖子只存在一秒(因爲如果已設置,它將用作開始日期和結束日期)? – 2010-01-22 08:16:35

回答

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 2010-01-22 12:19:26

0

如何maqny記錄在_db.Posts?如果不多,你可以先做.ToList(),並且比linq將能夠使用isEligibleForDisplay函數。

+0

記錄是可以上升很多,所以這不是一個解決方案:) – DucDigital 2010-01-22 09:07:54

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) 
          ) 
        ); 
} 
相關問題