- Mesajlar
- 1,737
Aslında tek sütun adı döndüren Linq sorgulamalarında Distinct kullanımı gayet basittir. MSDN in bu konuda verdiği örneğe bakalım.
.Distinct() işimizi görüyor. Ancak çok sutünlu sorgulamalarda Geriye List<TObject> biçiminde değer döndüreceksek kendi klasımızı kendimiz yazmalıyız. IEqualityComparer<TObject> türünüde miras alması gerekmetedir.
Bunu kullandığımız fonksiyonumuz aşağıdaki gibi olacaktır. UcretliBasvurulari benim daha önceden tanımladığım bir tür.
Kod:
public void Linq46()
{
int[] factorsOf300 = { 2, 2, 3, 5, 5 };
var uniqueFactors = factorsOf300.Distinct();
Console.WriteLine("Prime factors of 300:");
foreach (var f in uniqueFactors)
{
Console.WriteLine(f);
}
}
Kod:
public void Linq47()
{
List<Product> products = GetProductList();
var categoryNames = (
from p in products
select p.Category)
.Distinct();
Console.WriteLine("Category names:");
foreach (var n in categoryNames)
{
Console.WriteLine(n);
}
}
.Distinct() işimizi görüyor. Ancak çok sutünlu sorgulamalarda Geriye List<TObject> biçiminde değer döndüreceksek kendi klasımızı kendimiz yazmalıyız. IEqualityComparer<TObject> türünüde miras alması gerekmetedir.
Kod:
//ListSınıfı için Distinct
public class DistinctBasvurular : IEqualityComparer<UcretliBasvurulari>
{
public bool Equals(UcretliBasvurulari x, UcretliBasvurulari y)
{
if (x == null || y == null) //optional
return false;
else
return x.Bolum == y.Bolum;
}
public int GetHashCode(UcretliBasvurulari basvuru)
{
return basvuru.Bolum.GetHashCode();
}
}
Bunu kullandığımız fonksiyonumuz aşağıdaki gibi olacaktır. UcretliBasvurulari benim daha önceden tanımladığım bir tür.
Kod:
private List<UcretliBasvurulari> BolumBagla()
{
IEnumerable ie = ObjectDataSource1.Select();
var sonuc = (from s in ie.Cast<UcretliBasvurulari>()
orderby s.Bolum descending
select s).Distinct(new DistinctBasvurular());
return sonuc.ToList<UcretliBasvurulari>();
}