Использование счетчика в 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)
   };
Другие вопросы по тегам