2017-01-05 114 views
0

我用Linqer到SQL转换到LINQ,但结果是不一样的 我的SQL查询:使用计数返回比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() 
            }; 

结果:

的LINQ

enter image description here

SQL

enter image description here

谁能帮我?

+0

的't0_join.DefaultIfEmpty()'将是0 count行,因此返回一个默认值1 – Frogger

+0

我想在你的sql查询你是否正确地加入BaiBao与ChuyenNganh并且在你Linq你正确的加入ChuyenNganh与BaiBao。为了正确或者左连接的顺序问题,你正在计算基数(BaiBao.ChuyenNganhID) – Saadi

回答

0

不同之处在于,在LINQ统计所有记录时,SQL对外部连接表中的列BaiBao.ChuyenNganhID中的非空值进行计数。

你需要让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) 
    }; 
+0

我不这么认为。在g到g之后,g不包含BaiBao.ChuyenNganhID,因此g没有非空值 –

+0

@DiênCông您是否阅读并理解了答案中的查询? – dasblinkenlight

1

最有可能的SQL查询可以在LINQ改写没有group by但简单的LINQ GroupJoin

但随着转换的主要问题是,SQL COUNT(expr)不计算NULL值,并没有直接的LINQ相等的,所以无论是有条件的CountSum需要(我个人更喜欢后者,因为它通常会带来更好的SQL )。

所以,在你查询所需的最小变化是

group t by newgroup t0 by new

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

附:如本文开头提到的,我会给一个尝试以下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() 
    };