2012-02-20 154 views
0

我正在運行數據庫中的一段代碼。然而,沒有支持的翻譯到SQL(使用LINQ到SQL)。linq if語句或存儲過程if語句

如何轉換此代碼邏輯ro內聯linq或在存儲過程?我不知道數據庫和存儲過程,所以最好我想寫在LINQ。

public Post GetPageOwner(int pageid) 
{ 

    var posts = (from dp in db.Posts where dp.pageid == pageid select dp); 
    var returned = posts; 

    if (posts.Count() > 0) 
    { 
     var latest = posts.OrderByDescending(o => o.Date).FirstOrDefault(); 
     var sharedsamedayaslatest = (from p in posts where p.Date.AddDays(1) >= latest.Date select p); 
     if (sharedsamedayaslatest.Count() > 1) 
     { 
      var followedpost = (from p in posts from s in db.Subscriptions where s.Subscriber == UID && s.Subscribedto == p.UserId select p); 
      var count = followedpost.Count(); 
      if (count == 1) 
      { 
       returned = followedpost; 
      } 
      else if (count > 1) 
      { 
       returned = (from s in followedpost let reposts = GetPostReposts(s.id) let rating = GetPostRating(s.id) let score = reposts + rating orderby score descending select s); 
      } 
      else 
      { 
       //no follower shared this post so return the most liked 
       returned = (from s in sharedsamedayaslatest let reposts = GetPostReposts(s.id) let rating = GetPostRating(s.id) let score = reposts + rating orderby score descending select s); 
      } 
     } 
     else 
     { 
      //no shares on the day the latest share 
      returned = sharedsamedayaslatest; 
     } 
    } 
    else 
    { 
     //only one post 
     returned = posts; 
    } 

    return returned.FirstOrDefault(); //order by userid gets a random one 
} 
+0

我也許能幫助你,但我需要更多的信息。請提供與您的任務相關的每個表的表結構(包括PK和FK)以及您想要實現的僞代碼邏輯(因爲我懶得通過反向工程來了解它的代碼)。然後我會看看它是否可以用linq-to-sql可以轉換爲T-SQL的語句編寫。 – 2012-02-20 08:40:53

+0

是「數據庫中的代碼段」SQL嗎? – Jodrell 2012-02-20 08:45:32

+0

@MatteoMosca邏輯本身可以改變。這個想法只是爲了能夠使用linq中的if語句在db中爲每一行運行。所以這樣的事情(從db.table中的t到db.table2中的m,如果t.count> 1,選擇t否則如果t.count = 0(如果m。id == 1 select m else select t) – 2012-02-20 08:58:14

回答

0

可能像這樣的工作:

 public Post GetPageOwner(int pageid) 
    { 

     var posts = (from dp in db.Posts where dp.pageid == pageid select dp); 
     var returned = posts; 

     if (posts.Count() > 0) 
     { 
      var latest = posts.OrderByDescending(o => o.Date).FirstOrDefault(); 
      var sharedsamedayaslatest = (posts.Where(p => p.Date.AddDays(1) >= latest.Date)); 
      if (sharedsamedayaslatest.Count() > 1) 
      { 
       var followedpost = (posts.SelectMany(p => db.Subscriptions, (p, s) => new {p, s}).Where(
        @t => s.Subscriber == UID && s.Subscribedto == p.UserId).Select(@t => p)); 
       var count = followedpost.Count(); 
       if (count == 1) 
       { 
        returned = followedpost; 
       } 
       else if (count > 1) 
       { 
        returned = (followedpost.Select(s => new {s, reposts = GetPostReposts(s.id)}).Select(
         @t => new {@t, rating = GetPostRating(s.id)}).Select(
          @t => new {@t, score = reposts + rating}).OrderByDescending(@t => score).Select(@t => s)); 
       } 
       else 
       { 
        //no follower shared this post so return the most liked 
        (sharedsamedayaslatest.Select(s => new {s, reposts = GetPostReposts(s.id)}).Select(
         @t => new {@t, rating = GetPostRating(s.id)}).Select(
          @t => new {@t, score = reposts + rating}).OrderByDescending(@t => score).Select(@t => s)) = returned; 
       } 
      } 
      else 
      { 
       //no shares on the day the latest share 
       returned = sharedsamedayaslatest; 
      } 
     } 
     else 
     { 
      //only one post 
      returned = posts; 
     } 

     return returned.FirstOrDefault(); //order by userid gets a random one 
    } 
+0

這不會被linq-to-sql轉換,你需要寫一個沒有if/else和變量的linq(或lambda)查詢,通過適當的表結構,FKs等*可能是可能的,但正如我所說的,在嘗試寫入linq/lambda語句之前需要更多信息。 – 2012-02-20 10:40:53