none
FindAsync && Where komutu ve BaseEntity'den gelen Id alanına sorgu yapmak RRS feed

  • 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.


    10 Mart 2017 Cuma 12:57

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


    10 Mart 2017 Cuma 13:09
  • 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 ? 

    10 Mart 2017 Cuma 13:39
  • Bu dediğimi TKey sınıfı için yapacaksın zaten 100 tane sınıfa yazmana gerek yok. 
    10 Mart 2017 Cuma 13:47
  • 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 ? 


    10 Mart 2017 Cuma 14:51