【问题标题】:linq if statement, or stored procedure if statementslinq if 语句或存储过程 if 语句
【发布时间】: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


【解决方案1】:

可能是这样的:

        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
    }

【讨论】:

  • 这永远不会被 linq-to-sql 翻译。您需要编写一个不带 if/else 和变量的 linq(或 lambda)查询。使用适当的表结构、FK 等 可能 是可能的,但正如我所说,在尝试编写 linq/lambda 语句之前需要更多信息。
猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
相关资源
最近更新 更多