Использование счетчика в Linq возвращает результаты, отличные от запроса SQL
Я использую 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()
};
Результат:
Linq
SQL
Кто может исправить это для меня?
2 ответа
Скорее всего, SQL-запрос может быть переписан в LINQ без group by
но простой 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)
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()
};
Разница в том, что SQL считает ненулевые значения в 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)
};