我有以下代码,试图在同一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;
}
答案 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() })