Soran
FindAsync && Where komutu ve BaseEntity'den gelen Id alanına sorgu yapmak

Genel Tartışma
-
Merhaba,
RepositoryBase klasımda şu şekilde bir metot oluşturdum.
public Task<TEntity> GetAsync(TKey id) { return _dbSet.FindAsync(id); }
Bu kod bu şekilde çalışıyor. Fakat ben Base seviyede bir de status kontrolü eklemek istiyorum. (Status'u aktif olanlar listelensin sadece)
FindAsync'e herhangi bir Where fonksiyonu ekleyemiyorum. Bu kodu aşağıdaki gibi değiştirdiğimde ise;
public Task<TEntity> GetAsync(TKey id) { return (from p in _dbSet where p.Id == id && p.StatusDatabase == Status.Active.ToString() select p).FirstAsync(); }
p.Id == id kısmı derlenmiyor. Şu hatayı veriyor; Operator '==' cannot be applied to operands of type 'TKey' and 'TKey'
Bunun üzerine bu sefer kodu şu şekilde değiştirdim;
public Task<TEntity> GetAsync(TKey id) { return (from p in _dbSet where p.Id.Equals(id) && p.StatusDatabase == Status.Active.ToString() select p).FirstAsync(); }
Bu kod derleniyor ama metot çağırımında şu hatayı veriyor;
Unable to create a constant value of type 'System.Object'. Only primitive types or enumeration types are supported in this context.
Metodun bulunduğu class imzası ise şu şekilde
public abstract class RepositoryBase<TEntity, TKey> : IRepository<TEntity, TKey>, IDisposable where TEntity : BaseEntity<TKey>
Id alanı BaseEntity'de tanımlı.
Sizce nasıl bir yol izlemem gerekli ? Şimdiden yardımlarınız için teşekkür ederim.
- Düzenleyen Yunus Emre Kırkanahtar 10 Mart 2017 Cuma 12:57 kod hatası
- Değiştirilmiş Tür Kyamuran SalibryamMicrosoft contingent staff, Moderator 13 Mart 2017 Pazartesi 10:19
Tüm Yanıtlar
-
TKey sınıfında == ve != operatörünü overload etmen gerekiyor. Derleyici == operatörünü TKey sınıfı için tanıyamadığından hata veriyor overload işleminden sonra p.Id == id şeklinde kullanabiliyor olman lazım.
public class Person { public static bool operator ==(Person p1, Person p2) { return false; } public static bool operator !=(Person p1, Person p2) { return false; } public override bool Equals(object obj) { return base.Equals(obj); } public override int GetHashCode() { return base.GetHashCode(); } }
Not : return false kısımlarını kendi sınıfındaki alan karşılaştırmalarının sonucunu yazacak şekilde değiştirmen gerekiyor
- Düzenleyen Olcay GUZEL 10 Mart 2017 Cuma 13:10
-
TKey sınıfında == ve != operatörünü overload etmen gerekiyor. Derleyici == operatörünü TKey sınıfı için tanıyamadığından hata veriyor overload işleminden sonra p.Id == id şeklinde kullanabiliyor olman lazım.
public class Person { public static bool operator ==(Person p1, Person p2) { return false; } public static bool operator !=(Person p1, Person p2) { return false; } public override bool Equals(object obj) { return base.Equals(obj); } public override int GetHashCode() { return base.GetHashCode(); } }
Not : return false kısımlarını kendi sınıfındaki alan karşılaştırmalarının sonucunu yazacak şekilde değiştirmen gerekiyor
Cevap için teşekkür ederim.
Ben projemde bu sınıfı base bir repository olarak tasarladım. Dolayısı ile POCO sınıflara bir business yazmayı çok tercih etmiyorum ve de her sınıf için kod tekrarından da kaçınmak istiyorum (Projede yaklaşık 100'e yakın sınıf olacak) Bu yüzden base sınıfta bu işlemi yapmak öncelikli tercihim.Base tarafta bu işlemi yapmanın bir yolu var mıdır ?
-
-
Bu dediğimi TKey sınıfı için yapacaksın zaten 100 tane sınıfa yazmana gerek yok.
merhaba tekrar,
Sanırım eksik bilgi verdim hemen tamamlayayım.
TKey bir sınıf değil tip
TEntity ise BaseEntity classından türemiş bir POCO sınıf. TKey bu sınıfın id alanının tipini tutuyor. (int, bigint vs.. gibi)
Fikir vermesi açısından BaseEntity sınıfını da paylaşıyorum
public class BaseEntity<TKey> { public BaseEntity(User createUser) { CreateDate = DateTime.Now; CreateUserId = createUser.Id; //TODO Status } protected BaseEntity() { } public TKey Id { get; set; } public string Description { get; set; } public DateTime CreateDate { get; private set; } public int CreateUserId { get; private set; } public DateTime? UpdateDate { get; set; } public int? UpdateUserId { get; set; } public DateTime? DeleteDate { get; set; } public int? DeleteUserId { get; set; } public string StatusDatabase { get; protected set; } }
Bu bilgiler doğrultusunda tam olarak nereye kodu yazmam gerekiyor ?
- Düzenleyen Yunus Emre Kırkanahtar 10 Mart 2017 Cuma 14:52 edit