Yöntem bir mağaza ifadesine çevrilemez


89

Bu kodun LINQ to SQL ile çalıştığını gördüm, ancak Entity Framework kullandığımda şu hatayı atıyor:

LINQ to Entities, 'System.Linq.IQueryable'1 [MyProject.Models.CommunityFeatures] GetCommunityFeatures ()' yöntemini tanımıyor ve bu yöntem bir mağaza ifadesine çevrilemez .`

Depo kodu şudur:

public IQueryable<Models.Estate> GetEstates()
{
    return from e in entity.Estates
           let AllCommFeat = GetCommunityFeatures()
           let AllHomeFeat = GetHomeFeatures()
           select new Models.Estate
                      {
                                EstateId = e.EstateId,
                                AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat),
                                AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
                      };
}

public IQueryable<Models.CommunityFeatures> GetCommunityFeatures()
{
    return from f in entity.CommunityFeatures
           select new CommunityFeatures
                      {
                          Name = f.CommunityFeature1,
                          CommunityFeatureId = f.CommunityFeatureId
                      };
}

public IQueryable<Models.HomeFeatures> GetHomeFeatures()
{
    return from f in entity.HomeFeatures
           select new HomeFeatures()
           {
               Name = f.HomeFeature1,
               HomeFeatureId = f.HomeFeatureId
           };
}

LazyList, IQueryable'ın gücünü artıran bir Listedir.

Birisi bu hatanın neden oluştuğunu açıklayabilir mi?

Yanıtlar:


115

Sebep: Tasarım gereği, LINQ to Entities , tüm LINQ sorgu ifadesinin bir sunucu sorgusuna çevrilmesini gerektirir. Sorgu çevrilmeden önce istemcide yalnızca birkaç ilişkisiz alt ifade (sorgudaki ifadeler sunucudan gelen sonuçlara bağlı değildir) değerlendirilir. Bu durumda GetHomeFeatures () gibi bilinen bir çevirisi olmayan rastgele yöntem çağrıları desteklenmez.
Daha spesifik olmak gerekirse, LINQ to Entities yalnızca Parametresiz oluşturucuları ve Başlatıcıları destekler .

Çözüm: Bu nedenle, bu istisnayı aşmak için alt sorgunuzu GetCommunityFeatures () ve GetHomeFeatures () için ana sorguyla birleştirmeniz gerekir.LINQ sorgusu içinden doğrudan yöntemleri çağırmak yerine. Ayrıca, LINQ to SQL'de yaptığınız gibi, satırlarda parametreleştirilmiş yapıcılarını kullanarak yeni bir LazyList örneğini başlatmaya çalıştığınız bir sorun vardır . Bunun için çözüm, LINQ sorgularının (LINQ to Objects) istemci değerlendirmesine geçmek olacaktır. Bu , LazyList yapıcısını çağırmadan önce LINQ to Entities sorgularınız için AsEnumerable yöntemini çağırmanızı gerektirir . Bunun gibi bir şey çalışmalı:

public IQueryable<Models.Estate> GetEstates()
{
    return from e in entity.Estates.AsEnumerable()
       let AllCommFeat = from f in entity.CommunityFeatures
                         select new CommunityFeatures {
                             Name = f.CommunityFeature1,
                             CommunityFeatureId = f.CommunityFeatureId
                         },
       let AllHomeFeat = from f in entity.HomeFeatures
                         select new HomeFeatures() {
                             Name = f.HomeFeature1,
                             HomeFeatureId = f.HomeFeatureId
                         },
       select new Models.Estate {
            EstateId = e.EstateId,
            AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat),
            AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
       };
}


Daha Fazla Bilgi: Lütfen LINQ to Entities'e bir göz atın , neler desteklenmez? daha fazla bilgi için. Ayrıca , olası çözümler hakkında ayrıntılı bir tartışma için LINQ to Entities, nelerin desteklenmediğine ilişkin Geçici Çözümler konusuna bakın . (Orijinal web sitesi kapalı olduğundan her iki bağlantı da önbelleğe alınmış sürümlerdir)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.