The entity cannot be constructed in a LINQ to Entities query hatası

  • 06.04.2017 10:57
  • C Sharp
  • 6139

Linq ile bir listeyi normal sorgularımızı yazarak çekebiliyoruz. Fakat bir listeyi çekerken, o liste içerisindeki bir özelliğe ait de liste çekmek zorunda kaldığımızda dikkat etmemiz gereken bazı konular var. Örnek; iç içe liste sorgularımızı çekerken içerideki obje listesini çektiğimizde bu objenin veritabanı ile maplanmemiş bir obje olması şartı var. Eğer böyle bir sorguda veritabanı objesi kullanırsanız The entity cannot be constructed in a LINQ to Entities query hatasını almanız olağan.

Bunun çözümü ise DTO' lar. Yani Data Transfer Object' ler. Benim örneğimde bir iş listem var. Ve bu iş listesindeki ilgili personeller var. Yani iş listesinin çekerken, bir de o işe ait personel listesini çekiyorum. Fakat personel listesini çekerken veritabanı objem olan tblUser nesnesini kullandığım için bu hatayı aldım. Çözümü için ise yalın bir obje oluşturarak, bu obje ile işlemi tamamladım.

İş listesini çektiğim sorgu:

var bids = (from wrk in _db.Works
                        join bid in _db.tblBids on wrk.BidId equals bid.Id
                        join compny in _db.tblCorporates on bid.CorporateId equals compny.Id
                        join user in _db.tblUsers on wrk.CreateUser equals user.Id
                        join workType in _db.tblDefinitions on wrk.WorkTypeId equals workType.Id
                        join workStatus in _db.WorkStatus on wrk.WorkStatusId equals workStatus.Id
                        where wrk.WorkTypeId == type && wrk.DeleteUser == null
                        select new { wrk, compny, user, workType, bid, workStatus }).ToList().Select(c => new Work(c.bid, c.wrk.CreateUser.Value)
                        {
                            Id = c.wrk.Id,
                            Description = c.wrk.Description,
                            CreateUserName = c.user.Adi + " " + c.user.Soyadi,
                            CreateDate = c.wrk.CreateDate,
                            CustomerName = c.compny.Name,
                            WorkTypeName = c.workType.Name,
                            TrackerList = GetTrackers(c.wrk.Id),
                            Bid = c.bid,
                            WorkStatusId = c.wrk.WorkStatusId,
                            WorkStateText = c.workStatus.Name,
                            Price = c.wrk.Price
                        }).ToList();

 

GetTrackers metodum:

 public List<vmTracker> GetTrackers(int workId)
        {
            return (from trckrs in _db.Trackers
                    join user in _db.tblUsers on trckrs.PersonelId equals user.Id
                    where trckrs.TrackerTypeId == (int)TrackerTypes.Work_Tracker && trckrs.BidId == workId
                    select user).Select(c => new vmTracker() { Adi = c.Adi, Soyadi = c.Soyadi }).ToList();
        }

vmTracker nesnem (DTO görevini görüyor):

    public class vmTracker
    {
        public string Adi { get; set; }
        public string Soyadi { get; set; }
    }

Work nesnemin yan özelliklerini taşıyan partial classım:

 public partial class Work
    {
        [NotMapped]
        public tblBid Bid { get; set; }
        [NotMapped]
        public string TrackerName;
        [NotMapped]
        public string CreateUserName;
        [NotMapped]
        public string WorkTypeName;
        [NotMapped]
        public string CustomerName;
        [NotMapped]
        public string WorkStateText;
        [NotMapped]
        public List<vmTracker> TrackerList { get; set; }
        public Work()
        {

        }
        public Work(tblBid bid, int userId)
        {
            this.Bid = bid;
            this.CreateUser = userId;
            this.CreateDate = DateTime.Now;
            this.Tracker = this.Bid.Tracker;
            this.Price = this.Bid.BidPrice;
            this.BidId = this.Bid.Id;
            this.WorkTypeId = this.Bid.WorkType;
        }
    }

 

Bu yazıya yapılan yorumlar:

  • Ahmet

    04.03.2018 12:51

    Teşekkürler.

  • Derya Şimşek

    28.02.2018 13:43

    Gerçekten çok yardımı

  • Ahmet Topal Ziya

    21.02.2018 01:56

    Çok teşekkür ederim.

  • Kemal Can

    19.02.2018 12:45

    Teşekkürler.

Siz de düşüncelerinizi yazabilirsiniz:

;