如何将此查询转换为linq?

时间:2019-04-17 08:28:07

标签: c# sql asp.net linq

我正在尝试获取另一个表中的行数。我需要带有品牌行为的tbl_result_subject_brand表的结果计数。我对此情况有疑问:

pid()

此查询工作正常,但是如何在ASP.NET中将该查询转换为LINQ表达式?真的我不知道该怎么做。

SELECT tbl_brand.OID, (SELECT COUNT(*) FROM tbl_result_subject_brand WHERE tbl_result_subject_brand.brand_id = tbl_brand.OID) AS NewsCount FROM tbl_brand

5 个答案:

答案 0 :(得分:1)

我猜是这样的。

class Test
    {
        public void TestMethod()
        {
            var repo = new Repository();
            var result = repo.tbl_brand
                   .Select(b => new NetNewsCounts()
                   {
                       BrandID = b.OID,
                       ResultCount = repo.tbl_result_subject_brand.Count(rb => rb.brand_id == b.OID)
                   }).ToList();
        }

        private class Brand
        {
            public string OID { get; set; }
        }

        private class ResultBrand
        {
            public string brand_id { get; set; }
        }

        private class Repository
        {
            public List<Brand> tbl_brand { get; set; }
            public List<ResultBrand> tbl_result_subject_brand { get; set; }
        }

        private class NetNewsCounts
        {
            public string BrandID { get; set; }

            public int ResultCount { get; set; }
        }
    }

答案 1 :(得分:0)

如果执行普通联接,则只会获得两个表上的id的结果。如果这确实是您想要的,则可以简化它,只查询一个表:

var result = muleContext.tbl_result_subject
    .GroupBy(i => i.BrandID)
    .Select(i => new NetNewsCounts { BrandID = i.Key, ResultCount = g.Count() });

如果要使用tbl_brand中的ID,但可能不需要tbl_result_subject中的ID,请执行类似于以下操作的左联接:LINQ - Left Join, Group By, and Count。突出部分与上面的类似。

答案 2 :(得分:0)

您可以按查询将查询简化为一组:

SELECT OID, COUNT(*) 
FROM tbl_result_subject_brand
Group By OID

可以将其翻译为linq:

(from r in muleContext.tbl_result_subject_brand
group r by r.OID into g
select new NetNewsCounts { BrandID = g.Key, ResultCount= g.Count() }).ToList();

答案 3 :(得分:0)

这样写

public List<Result> GetCount()
        {
            using (MuleContext db = new MuleContext())
            {


                var list = db.tbl_brand.Tolist();
                List<Result> GN = new List<Result>();
                foreach (var n in list)
                {
                    Result Notif = new Result()
                    {
                        OID = n.OID,

                   ResultCount=db.tbl_result_subject_brand.where(t=>t.brand_id=n.OID)
                    };
                    GN.Add(Notif);
                }
                return GN;
            }
        }

答案 4 :(得分:0)

有两种解决方法,但最简单的方法是最直接的方法。我假设您的实际查询要求是您获得所有OID值,该值的计数(包括0)在另一个表中匹配行。

这是您的源查询(经过重新格式化,并带有一些别名以使其更简单):

SELECT 
    b.OID, 
    (
        SELECT COUNT(*) 
        FROM tbl_result_subject_brand rs
        WHERE rs.brand_id = b.OID
    ) AS NewsCount 
FROM tbl_brand b

我们至少可以在某些LINQ ORM中做几乎完全相同的事情:

using (var ctx = new MuleContext())
{
    var query = 
        from b in ctx.tbl_brand
        select new
        {
            b.OID,
            NewsCount = ctx.tbl_result_subject_brand.Count(rs => rs.brand_id == b.OID)
        };

    var list = query.ToList();
}

当使用Linq2DB时,这对我有用,它将Linq2DB转换为与原始查询基本相同的SQL查询。完全相同的结构。使用上述格式,其他ORM可能不太正常。

另一个选项是组和联接。请注意,默认情况下,联接是 inner 。您需要使用join...into...DefaultIfEmpty来获得等效的left outer join,然后处理缺失的值。这是一个痛苦的过程。

这有两种形式:group-then-join或join-then-group。第一个使用子查询获取计数,然后加入该查询以获取所需的值:

var rsCounts = 
    from rs in ctx.tbl_result_subject_brand
    group 0 by rs.brand_id into grp
    select new { brand_id = grp.Key, NewsCount = (int?)grp.Count() };

var query =
    from b in ctx.tbl_brand
    join rs in rsCounts on b.OID equals rs.brand_id into rstmp
    from rs in rstmp.DefaultIfEmpty()

    select new
    {
        b.OID,
        NewsCount = rs.NewsCount ?? 0
    };

(您可以在一个语句中完成它。有时候很难弄清楚它在做什么。)

另一个版本将表连接在一起,然后在相关列上分组。这使用Sum而不是Count检查丢失的行:

var query = 
    from b in ctx.tbl_brand
    join rs in ctx.tbl_result_subject_brand on b.OID equals rs.brand_id into rstmp
    from rs in rstmp.DefaultIfEmpty()

    group (rs.brand_id == null ? 0 : 1) by b.OID into grp
    select new
    {
        OID = grp.Key,
        NewsCount = grp.Sum()
    };

不漂亮,但是可以。

我建议您看看运行以上命令时SQL的外观。有时,SQL有点奇怪。