Должен ли я применять подсчет в БД или в коде? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть следующий код, где я пытаюсь получить количество строк в одном и том же dataset с различными совпадениями.

У меня вопрос, должен ли я получить счет в коде C # с помощью IEnumerable или запросить IQueryable из базы данных?

Какая из них более эффективна, несколько транзакций базы данных или IEnumerable фильтрация и подсчет?

public List<Tuple<string, int>> CalismaVeIzinleriHesapla(long personelId, DateTime baslangic, DateTime bitis)
{
    var hesaplamalar = new List<Tuple<string, int>>();
    var puantajList = puantajlar.Where(p => p.PersonelId == personelId && (p.Tarih >= baslangic && p.Tarih <= bitis));

    var haftaTatili = puantajList.Where(p => p.Secenek.Deger == "Ht").Count();
    var resmiTatil = puantajList.Where(p => p.Secenek.Deger == "Rt").Count();
    var yillikIzin = puantajList.Where(p => p.Secenek.Deger == "Yi").Count();
    var odenecekRapor = puantajList.Where(p => p.Secenek.Deger == "R+").Count();
    var dogumIzni = puantajList.Where(p => p.Secenek.Deger == "Di").Count();
    var olumIzni = puantajList.Where(p => p.Secenek.Deger == "Öi").Count();
    var evlilikIzni = puantajList.Where(p => p.Secenek.Deger == "Ei").Count();
    var odenmeyecekRapor = puantajList.Where(p => p.Secenek.Deger == "R-").Count();
    var ucretsizIzin = puantajList.Where(p => p.Secenek.Deger == "Üi").Count();
    var devamsizlik = puantajList.Where(p => p.Secenek.Deger == "D").Count(); 

    return hesaplamalar;
}

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Что касается вашего случая, запросы и подсчет в БД более эффективны.что-то вроде этого будет эффективным.

puantajlar
  .Where(p => p.PersonelId == personelId && (p.Tarih >= baslangic && p.Tarih <= bitis))
  .GroupBy(x => x.Secenek.Deger)
  .Select(group => new { group.Key, Count = group.Count()  })
0 голосов
/ 12 февраля 2019

Сложность и производительность, оба они зависят от вашей ситуации, если нет огромных данных, то Performance не имеет значения, но иногда вам приходится принимать решение на основе вашей ситуации.Запустив ваш код, он должен подключиться к БД и выполнить запрос count в каждой строке кода, и на 100% ясно, что подсчет одинаковых строк в БД более эффективен за один проход, поэтому вы можете сделать что-то вроде:

select p.Secenek.Deger,
....
sum(case when p.Secenek.Deger = 'Ht' then 1 else 0 end) haftaTatili,
sum(case when p.Secenek.Deger = 'Rt' then 1 else 0 end) resmiTatil
.....
from puantajlar p
group by p.Secenek.Deger

или вы можете сделать это более эффективным способом, сгруппировав их в один кадр, также как упомянуто @amd:

puantajlar
  .Where(p => p.PersonelId == personelId && (p.Tarih >= baslangic && p.Tarih <= bitis))
  .GroupBy(x => x.Secenek.Deger)
  .Select(group => new { group.Key, Count = group.Count()  })
0 голосов
/ 12 февраля 2019

У меня вопрос: должен ли я получить счет в коде C # с помощью IEnumarable или запросить IQueryable в БД

Если вам нужен только счетчик строк, тогда счет должен бытьсделано в базе данных, а не в памяти.Если вы подсчитываете в памяти, вытягивая список данных из базы данных в память, то это излишне тратит память вашего сервера и снижает производительность.

...