2013-02-27 10 views
18

Üçüncü tarafın kullanımına sunulacak ve kendi web uygulamalarım tarafından da kullanılabilecek bir Web API projesi yapıyorum. Web API yöntemleri, karmaşık tür/nesnelerin JSON temsillerini döndürür. Bunlar, üçüncü tarafın kullanımına sunabileceğim önceden tanımlanmış sınıflar, böylece verilerin nasıl yapılandırıldığını anlıyor ve JSON'u seri hale getirebiliyorlar. Birisi beni düzelinceye kadar bu sınıflara DTO sınıfları olarak bakacağım.Linq sonuçlarını yineleme olmadan DTO sınıf nesnesine nasıl dönüştürebilirim

Ben (veritabanından) Aşağıdaki otomatik oluşturulan varlık modeli de bu Kullanıcı sınıfı Tarama tabloya bir ilişki (ilişki bu soruya amacıyla göz ardı edilebilir) ile zaten bir ...

public partial class User 
{ 
    public User() 
    { 
     this.Scans = new HashSet<Scan>(); 
    } 

    public int Id { get; set; } 
    public string Username { get; set; } 
    public string Password { get; set; } 
    public bool Active { get; set; } 

    public virtual ICollection<Scan> Scans { get; set; } 
} 

Ve sunu katmanına Liste olarak dönmek istediğim aşağıdaki DTO sınıfı (Sunum için IEnumerable'ı kullanmam gerektiğini sanmıyorum?).

public class User 
{ 
    public int Id; 
    public string Username; 
    public string Password; 
    public bool Active; 
} 

Bu bileşene ilişkin iş katmanım şu anda aşağıdakine benzer. Kullanıcıları veritabanından almak ve sonuçları ayrıştırmak ve POCO Kullanıcıları Listesi <> 'ı döndürmek için Linq kullanma.

public List<User> Get() 
{ 
    List<User> userList = new List<User>(); 

    using (var db = new MyContext()) 
    { 
     var query = from u in db.Users 
        orderby u.FirstName 
        select u; 

     foreach (var item in query) 
     { 
      User user = new User(); 
      user.Id = item.pkUser; 
      user.Username = item.Username; 
      user.Password = item.Password; 
      user.Active = item.Active; 

      userList.Add(user); 
     } 
    } 

    return userList; 
} 

bu verimsiz görünmektedir gibi sonuçlarda Ayrıştırma ve ben (örn Bu sorunun Mapping Linq Query results to a DTO class yılında cevap) Eğer yineleme olmadan Linq sorguda bu tür bir şey yapabileceğini gördük.

Nesnelerimde bu tür bir Linq sorgusunu etkinleştirmek için IEnumerable'ı nerede ve nasıl kullanacağım konusunda emin değilim ve aynı zamanda yukarıdaki başvurulan soruya benzer bir sorguyu nasıl yazacağımdan da emin değilim. çok daha basit bir senaryo.

Yardımlarınız için şimdiden teşekkür ederiz.

P.S. Lütfen Web API üzerinden Kullanıcı Adı ve Parola'yı gösterdiğimi ve ayrıca tüm Kullanıcıları bir kerede iade ettiğimi dikkate almayın. Yukarıdaki, bu sorunun amacı için kodumun basitleştirilmiş bir sürümüdür.

+0

Ne olursa olsun yinelemeniz gerekecek. Listenizi dönüştürmek için 'Enumerable.Select' kullanabilirsiniz. – Romoku

cevap

33

tam yöntem olabilir:

public List<User> Get() 
{ 
    using (var db = new MyContext()) 
    { 
     return (from u in db.Users 
       orderby u.FirstName 
       select new User() 
       { 
        Id = u.pkUser, 
        Username = u.Username, 
        Password = u.Password, 
        Active = u.Active 
       }).ToList(); 
    } 
} 

Sen "yineleme olmadan" sonucunu istediklerini belirtti. LINQ kullanmak aynı zamanda yinelemeyi ortadan kaldırmaz. Bunu kodunuzda yapmıyorsunuz, ancak ToList() yöntemini çağırdığınızda gerçekten oluyor.

+0

En basit ve en esnek cevapla ilk kez en iyiye gideceğim. Teşekkürler. – Dan

9

Sen dönüşüm yapmak için LINQ nesnelere kullanabilirsiniz:

using (var db = new MyContext()) 
{ 
    var query = from u in db.Users 
       orderby u.FirstName 
       select u; 

    return query.AsEnumerable().Select(item => 
       new User 
        { 
         Id = item.pkUser, 
         Username = item.Username, 
         Password = item.Password, 
         Active = item.Active 
        }).ToList(); 
} 
3

AutoMapper kullanıyorsak gerçekten kompakt olabiliriz. senin depoda eşleyicisinde Önyükleme

:

Mapper.CreateMap<AutoGenNamespace.User, DtoNamespace.User>();

Sonra bu oldukça basit (ve IEnumerable dönen yanlış bir şey yoktur).

public IEnumerable<User> Get() 
{ 
    using (var db = new MyContext()) 
    { 
     return (from u in db.Users 
       orderby u.FirstName 
       select Mapper.Map(u)).AsEnumerable(); 
    } 
} 
+0

"* nothing wrong *" ile katılıyorum. Bir şey * yanlış gidebilir! 'var list = Get();' ve daha sonra listeyi bir defadan fazla yineleme. –

+0

@ MD.Unicorn iyi sonra 'var list = Get(). ToList(); İmza ile yöntemden geri alınabileceğini biliyorsun. – Romoku

+0

Evet Biliyorum! Ama Dan'in bildiğinden emin misin? :-) –

-1

Benim sorgumda birden çok childs ile ebeveyn tablo var.Bu ise

public class TeamWithMembers 
     { 
      public int TeamId { get; set; } 
      public string TeamName { get; set; } 
      public string TeamDescription { get; set; } 
      public List<TeamMembers> TeamMembers { get; set; } 
     } 

Ben hata veriyor linq sorguda ToList() kullanıyordum zaman. Şimdi linq sorguda anonim türünü kullanarak ve teamMemberQueryResult linq sorgudan resultset olan bu

List<TeamModel.TeamWithMembers> teamMemberList = teamMemberQueryResult.AsEnumerable().Select(item => 
new TeamModel.TeamWithMembers() { 
    TeamId=item.TeamId, 
    TeamName=item.TeamName, 
    TeamMembers=item.TeamMembers.ToList() 
}).ToList(); 

gibi sonraki sorguda dönüştürmek duyuyorum.

İlgili konular