我应该在数据库还是在代码中申请计数?

时间:2019-02-12 11:01:06

标签: c# entity-framework asp.net-core asp.net-core-mvc entity-framework-core

我有以下代码,试图在同一dataset中获得各种匹配项的行数。

我的问题是我应该使用IEnumerable还是通过从数据库查询IQueryable来获取C#代码中的计数?

哪个是效率更高的,多个数据库事务或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 :(得分:4)

对于您的情况,在数据库中查询和计数更为有效。 这样的事情会很有效。

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()  })

答案 1 :(得分:2)

  

我的问题是我应该使用IEnumarable还是查询DB中的IQuaryable来获取C#代码中的计数

如果仅需要对行进行计数,则必须在数据库中而不是在内存中进行计数。如果确实通过将数据列表从数据库中拉到内存中来进行内存计数,那么这将不必要地浪费服务器内存并降低性能。

答案 2 :(得分:1)

复杂性和性能都取决于您的情况,如果没有大量数据,Performance无关紧要,但是有时您必须根据您的情况做出决定。 通过运行您的代码,它应该连接到数据库并在每行代码中运行count查询 100%清楚的是一次计数DB中相同行的效率更高,因此您可以执行以下操作:

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()  })