2009-09-02 23 views
6

Veritabanı modelimin üzerine bir modelim var ve Deposu'ndaki nesneleri eşleştiriyorum. Bununla birlikte, görünüşe göre doğrudan GetUserlerimde "yeni seçmemi" veya aşağıda belirtildiği gibi "factoryresult" seçeneğini seçmeme fark yaratıyor. Çalışma zamanında hatası alıyorum, CreateFromDbModel yönteminin sql (System.NotSupportedException) için bir çevirisi yok.SQL için linq ile fabrika sınıfları nasıl kullanılır?

Bunun bir yolu var mı? Bir şekilde tamir edebilir miyim?

fabrika yöntemini kullanmak isteyen nedeni herhangi yorumlar için ...

Teşekkür başka nesneler instanciate ve tek bir yerde 'haritalama kodu' tutmak isteyebilirsiniz yani Anders

public IQueryable<User> GetUsers(bool includeTeams) 
    { 
     return from u in _db.sc_Players 
       where (includeTeams || (!u.aspnet_User.sc_Player.IsTeam)) 
       select UserFactory2.CreateFromDbModel(u); 
    } 


    public static User CreateFromDbModel(sc_Player player) 
    { 
     return new User 
        { 
         Id = player.sc_PlayerID, 
         FirstName = player.FirstName.Trim(), 
         LastName = player.LastName.Trim(), 
         PresentationName = player.FirstName.Trim() + " " + player.LastName.Trim(), 
         LoginName = player.aspnet_User.LoweredUserName, 
         IsTeam = player.IsTeam, 
         Email = player.aspnet_User.aspnet_Membership.Email, 
         Password = player.aspnet_User.aspnet_Membership.Password 
        }; 
    } 

cevap

1

Sorun, GetUsers yönteminizde IQueryable'i döndürdüğünüzden mi? Bunun yerine Listeyi döndürmeyi deneyin. Bu, Linq sorgusunu yöntem içinde yürütmeye zorlar.

public List<User> GetUsers(bool includeTeams) 
{ 
    return (from u in _db.sc_Players 
    where (includeTeams || (!u.aspnet_User.sc_Player.IsTeam)) 
    select UserFactory2.CreateFromDbModel(u)).ToList(); 
} 

Sorunun giderilip giderilmeyeceğinden emin değilsiniz, yalnızca bir öbek. Linqpad'de yaptığınız işi yerel bir veritabanında kopyalayabildim ve işe yaradı. Ama benim örneğim bir IQueryable döndürmedi. GetUsers() dışındaki IQueryable koleksiyonunu değiştiren furthur siz misiniz?

Düzenleme:

ben kontrol biraz daha yaptık. IQueryable toplama) (GetUsers çağrıldıktan sonra ikinci bir Linq sorguda kullanılan bu yüzden benim örnek modifiye zaman sadece hatayı çoğaltmak başardı:

IQueryable<User> query = GetUsers(true); 

var q = from u in query 
    where u.Name.Contains("Bob") 
    select new {Name = u.FirstName + " " + u.LastName}; 

Bir Listesini dönecektir eğer GetUsers yukarıda önerildiği gibi eminim() hata gider. Sadece aşağı tarafı GetUsers() çağırdıktan sonra yaptığınız herhangi bir filtreleme, sorguyu zaten .ToList() çağırırken çalıştırdığınız için veritabanından döndürülen veri miktarını sınırlamaz.

Düzenleme 2:

Maalesef sorgusunda fabrika yöntemini içerecek şekilde başka bir yolu yoktur sanmıyorum. Bir fikrim daha var. IQueryable için bir uzantı yöntemi oluşturabilir, ToUserList() gibi bir şey diyebilirsiniz. ToUserList() içinde, sorgudaki ToList() yöntemini ve kullanıcı koleksiyonunu döndüren fabrika yönteminizi arayın. Linq kullanarak verileri filtrelemeyi tamamladığınızda bu yöntemi çağırın. Bu, veriyi veritabanından yüklemeye hazır olduğunuzda yalnızca sorguyu yürütmenize izin verecektir. Aşağıda bir örnek verilmiştir.

public static List<Users> ToUserList(this IQueryable<User> query) 
{ 
    return query.ToList().Select(u => UserFactory2.CreateFromDbModel(u)); 
} 

Çağrı böyle uzatma yöntemi: Bu mantıklı

// Filter the data using linq. When you are ready to execute the query call: 
query.ToUserList(); // Query will execute and a list of User objects returned. 

Umut. Douglas H.

+0

Teşekkür Douglas ve Rossisdead, benim fabrika yöntemini çağırmadan önce listelemek için dönüştürme çalıştı, ancak sadece tüm linq dönmek zorunda yapmak var Veritabanından nesneler, tüm etki alanı modeli nesnelerini de oluşturmam gerekiyor - ve bunu gerektirmeyen bir yol bulmaya çalışıyordum ... Ayrıca, hizmet katmanımda filtreleme yapıyorum ve listeyi queryable. ... –

+0

Merhaba Anders, Bkz. Yukarıdaki 2. – Douglas

+0

Merhaba Douglas, Cevabınızı yanıt olarak işaretledim, ancak veritabanı linq nesnelerini veri katmanında veri katmanı nesnelerini hizmet katmanına göstereceği veri katmanında tutmayı umuyordum. –

1

Hata hemen hemen her şeyi açıklıyor.

"yöntem CreateFromDbModel sql (Sistem.NotSupportedException) "

CreateFromDbModel yönteminiz bir sql işlevi değil. Uygulamanız, özellikle sunucudan size döndürülene kadar CreateFromDbModel işlevini çalıştıramayacaktır. ToList() veya onlara CreateFromDbModel yayınlanmadan önce sorguya benzer bir şey.

İlgili konular