2010-01-22 59 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) 
          ) 
        ); 
} 
相关问题