【发布时间】:2012-02-20 18:20:33
【问题描述】:
我希望在数据库中运行一段代码。但是不支持对 sql 的翻译(使用 linq to sql)。
如何将此代码逻辑转换为 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
}
【问题讨论】:
-
我或许可以为您提供帮助,但我需要更多信息。请提供与您的任务相关的每个表的表结构(包括 PK 和 FK)以及您要实现的伪代码逻辑(因为我懒得尝试通过对代码进行逆向工程来理解它)。那我看看能不能写成linq-to-sql能翻译成T-SQL的语句。
-
“数据库中的那段代码”是SQL吗?
-
@MatteoMosca 逻辑本身可以改变。这个想法只是为了能够使用 linq 中的 if 语句在数据库中为每一行运行。所以像这样(从 db.table 中的 t 从 db.table2 中的 m if t.count>1 select t else if t.count = 0 (if m.id ==1 select m else select t)
-
您的问题是您试图以程序或 sql 方式进行推理。 Linq 方法是不同的:它可能做你想做的事,但不是你想的那样。但为了能够帮助你,我仍然需要我要求的东西。
-
posts.Count() 是一个繁重的操作,在 if 语句中没有必要。考虑将其更改为 .Any()
标签: c# c linq linq-to-sql