0

我使用 Linqer 将 SQL 转换为 LinQ,但结果不一样 My SQL 查询:

    Select ChuyenNganh.ChuyenNganhID,ChuyenNganh.TenChuyenNganh,SoLuong= count(BaiBao.ChuyenNganhID )
from BaiBao right join ChuyenNganh on ChuyenNganh.ChuyenNganhID = BaiBao.ChuyenNganhID
group by  ChuyenNganh.ChuyenNganhID, ChuyenNganh.TenChuyenNganh

转换为 Linq

var queryChuyenNganh = from t in myPhanLoaiTaiLieuDataContext.ChuyenNganhs
                                   join t0 in myPhanLoaiTaiLieuDataContext.BaiBaos on new { ChuyenNganhID = t.ChuyenNganhID } equals new { ChuyenNganhID = Convert.ToInt32(t0.ChuyenNganhID) } into t0_join
                                   from t0 in t0_join.DefaultIfEmpty()
                                   group t by new
                                   {
                                       t.ChuyenNganhID,
                                       t.TenChuyenNganh
                                   } into g
                                   select new
                                   {
                                       ChuyenNganhID = (System.Int32)g.Key.ChuyenNganhID,
                                       g.Key.TenChuyenNganh,

                                       SoLuong  =(Int32)g.Count()
                                   };

结果:

林克

在此处输入图像描述

SQL

在此处输入图像描述

谁能帮我修好?

4

2 回答 2

1

很可能 SQL 查询可以在没有group by简单 LINQ的情况下用 LINQ 重写GroupJoin

但是您转换的主要问题是 SQLCOUNT(expr)不计算NULL值,并且没有直接的 LINQ 等效项,因此需要条件CountSum需要(我个人更喜欢后者,因为通常它可以转换为更好的 SQL)。

因此,您查询所需的最小更改是

group t by newgroup t0 by new

SoLuong =(Int32)g.Count()_SoLuong = g.Sum(t0 => t0 != null ? 1 : 0)

PS 如开头所述,我将尝试以下 LINQ 查询:

var queryChuyenNganh = 
    from t in myPhanLoaiTaiLieuDataContext.ChuyenNganhs
    join bb in myPhanLoaiTaiLieuDataContext.BaiBaos
    on t.ChuyenNganhID equals bb.ChuyenNganhID into t_BaiBaos
    select new
    {
        t.ChuyenNganhID,
        t.TenChuyenNganh,
        SoLuong = t_BaiBaos.Count()
    }; 
于 2017-01-05T11:11:24.503 回答
0

BaiBao.ChuyenNganhID不同之处在于 SQL 计算外部连接表中的列中的非空值,而 LINQ 计算所有记录。

您还需要使 LINQ 计数非空值:

var queryChuyenNganh = from t in myPhanLoaiTaiLieuDataContext.ChuyenNganhs
   join t0 in myPhanLoaiTaiLieuDataContext.BaiBaos
       on new { t.ChuyenNganhID } equals new { ChuyenNganhID = Convert.ToInt32(t0.ChuyenNganhID) } into t0_join
   from t0 in t0_join.DefaultIfEmpty()
   group new {T=t, NonNull=t0.ChuyenNganhID != null} by new
   {
       t.T.ChuyenNganhID,
       t.T.TenChuyenNganh
   } into g
   select new
   {
       ChuyenNganhID = (System.Int32)g.Key.ChuyenNganhID,
       g.Key.TenChuyenNganh,
       SoLuong  =(Int32)g.Count(x => x.NonNull)
   };
于 2017-01-05T10:51:42.013 回答