在 Linq 中使用 Count returns 与 SQL 查询不同的结果
Use Count in Linq returns different results than SQL query
我使用 Linqer 将 SQL 转换为 LinQ 但结果不一样
我的 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
SQL
谁能帮我解决这个问题?
不同之处在于,SQL 计算外连接 table 中的列 BaiBao.ChuyenNganhID
中的非空值,而 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)
};
最有可能的是 SQL 查询可以在没有 group by
的 LINQ 中重写,而是简单的 LINQ GroupJoin
。
但是您转换的主要问题是 SQL COUNT(expr)
不计算 NULL
值,并且没有直接的 LINQ 等价物,因此有条件的 Count
或 Sum
是必需的(我个人更喜欢后者,因为通常它翻译成更好的 SQL)。
因此,您查询所需的最小更改是
group t by new
至 group t0 by new
和SoLuong =(Int32)g.Count()
到SoLuong = g.Sum(t0 => t0 != null ? 1 : 0)
P.S。如开头所述,我将尝试以下 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()
};
我使用 Linqer 将 SQL 转换为 LinQ 但结果不一样 我的 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
SQL
谁能帮我解决这个问题?
不同之处在于,SQL 计算外连接 table 中的列 BaiBao.ChuyenNganhID
中的非空值,而 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)
};
最有可能的是 SQL 查询可以在没有 group by
的 LINQ 中重写,而是简单的 LINQ GroupJoin
。
但是您转换的主要问题是 SQL COUNT(expr)
不计算 NULL
值,并且没有直接的 LINQ 等价物,因此有条件的 Count
或 Sum
是必需的(我个人更喜欢后者,因为通常它翻译成更好的 SQL)。
因此,您查询所需的最小更改是
group t by new
至 group t0 by new
和SoLuong =(Int32)g.Count()
到SoLuong = g.Sum(t0 => t0 != null ? 1 : 0)
P.S。如开头所述,我将尝试以下 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()
};