SORU
2 EKİM 2010, CUMARTESİ


Yöntem deposu bir ifade tercüme edilemez

Bu kod ile SQL ETMENİZ için çalışırken gördüm ama Varlık Çerçevesi kullanırken, bu hata atar:

Yöntem tanımıyor Varlıklar bu SERİ 'Sistemi.Seri.Iqueryable'1[MyProject.Modelleri.CommunityFeatures] GetCommunityFeatures()' yöntemi ve bu yöntem bir depo ifade tercüme edilemez.`

Depo kodu bu

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 gücünü genişleten bir Listesini.

Birisi neden bu hata oluşur açıklayabilir mi?

CEVAP
3 EKİM 2010, Pazar


Sebep: Tasarım,LINQ to Entitiesbütün kontrol ETMENİZ ifade sunucu bir sorgu çevrilmesi sorgu gerektirir. Sadece birkaç birbiri ile alakasız bir taşıyıcının (sunucu sonuçları bağımlı olmayan sorgudaki ifadeleri) sorgu çevrilir önce istemci üzerinde değerlendirilir. Bilinen bir çevirisi olmayan keyfi bir yöntem çağırmaları, GetHomeFeatures gibi() bu durumda, desteklenmez.
Daha spesifik olmak gerekirse, Varlıkları için sadece destek ETMENİZParametresiz kurucularveBaşlatıcılar.

Çözüm: Bu nedenle, bu özel durumu atlatmak için temel bir alt sorgu birleştirme gerekir() GetCommunityFeaturesve() GetHomeFeaturesyerine ETMENİZ sorgu içinde doğrudan çağırma yöntemleri. Ayrıca, yeni bir örneğini oluşturmaya çalıştığını hatlarda bir sorun varLazyListonun parametreli kurucular kullanarak, olduğu gibi yapıyor olabilirSERİ SQL için. Bunun çözümü ise ETMENİZ sorgular müşteri değerlendirme (Nesneleri bu SERİ) geçmek için. Bu Varlıklar sorgular LazyList kurucu çağırmadan önce senin ETMENİZ için AsEnumerable yöntemi çağırmak için gerektirir.

Onun gibi bir şey:

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:Bir göz atın lütfenLINQ to Entities, what is not supported?daha fazla bilgi için. Ayrıca bakLINQ to Entities, Workarounds on what is not supportedOlası çözümler üzerinde ayrıntılı bir tartışma için. (Her iki link de orijinal web sitesi kapalı olduğundan önbelleğe alınan sürüm)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • fireflame65

    fireflame65

    27 Mart 2007
  • Stevie

    Stevie

    2 Mayıs 2010
  • WOSU Public Media

    WOSU Public

    23 AĞUSTOS 2007