2011-07-26 21 views
5
ben den veritabanı bilgisi dönmek için SQL Linq to kullanarak düşünüyorum bir WCF/DİNLENME web hizmeti var

SQL için.dönen veri kümeleri REST/WCF hizmeti

Bu örneğin, tablolar karşı temel sorgular yapmak ve satırları dönecek kadar kolay:

[WebGet(UriTemplate = "")] 
    public List<User> GetUsers() 
    { 
     List<User> ret = new List<User>(); ; 
     using (MyDataContext context = new MyDataContext()) 
     { 
      var userResults = from u in context.Users select u; 
      ret = userResults.ToList<User>(); 
     } 

     return ret; 
    } 

Ama birden fazla tablodan veri dönmek istiyorsanız ne ya bu tam olarak tablonun şema eşleşmiyor ? Ben örneğin, bu sorgudan sonuçları döndürmek için nasıl bilemiyorum: Açıkçası

var userResults = from u in context.Users 
    select new { u.userID, u.userName, u.userType, 
       u.Person.personFirstname, u.Person.personLastname }; 

çıkan satır kümesi "Kullanıcı" şemaya uygun değildir, bu yüzden sadece bir listeye dönüştürmek olamaz Kullanıcı nesnelerinin

Ben sonuç grubuyla ilgili benim nesne modelindeki yeni bir varlık yapma çalıştı, ama dönüşüm yapmak istemiyor.

Neyi eksik?

Düzenleme: ilgili soru: Ne sonuçları hakkında saklı prosedürler döndü? Aynı sorun, hizmet yoluyla iade edilmek için bunları paketlemenin en iyi yolu nedir?

cevap

4

Sen Kompleks türü iade bir Complex Type ve döndürmek yerine Anonim nesnesi oluşturabilir. Saklı yordamları işlev içe aktarmayı kullanarak eşlediğinizde, otomatik olarak karmaşık bir tür oluşturma seçeneğiniz vardır.

using (linkDataContext link = new linkDataContext()) 
{ 
    var data = (from t in link.TimesheetDetails 
       select new MyTimesheet 
       { 
        Id = t.Id, 
        Data = t.EmployeeId.ToString() 
       }).ToList(); 
} 
+0

Bu Entity Framework, düz Linq To SQL değil. Mümkünse Entity Framework'ü kullanmaktan kaçınmaya çalışıyorum. – BDW

+0

Oh Görüyorum. M4tt1mus'un önerdiği gibi, anonim bir isim yerine somut bir sınıf oluşturabilirsiniz. –

+0

AMA… Entity Framework kullanıyorum diyelim. Karmaşık türlerin depolanmış proxy'lerle nasıl çalıştığını biliyorum, bu bir sorun değil. Biri, karmaşık türüne yukarıdaki linq sql sorguyu nasıl eşler? Çalıştığım hiçbir şey çalışmıyor. – BDW

5

Genel anlamda, bir hizmetten alanı nesneleri dönmemesi:

public class MyTimesheet 
{ 
    public int Id { get; set; } 
    public string Data { get; set; } 
} 

Ardından Linq sorgudan oluşturun:

ihtiyacınız özelliklere sahip özel bir sınıf oluşturun Çünkü eğer yaparsan, buldukların gibi sorunları yaşayacaksın. Etki alanı nesneleri, sorun etki alanındaki belirli bir varlığı açıklamak için tasarlanmıştır ve genellikle bir servis çağrısından dönmek üzere belirli bir veri kümesini sunarak güzelce uyuşmaz.

Sen aktarmak gereken tek bilgi içeren onları temsil etmek data transfer objects oluşturarak hizmetten alan adı varlıkları ayırımı en iyi. DTOs alanı nesne (ler) almak ve (onlar tefrika olabilir böylece aynı zamanda bir parametresiz yapıcı gerekir) özellik değerleri gerekli her türlü kopya kurucular olurdu, yoksa AutoMapper gibi bir nesne-nesne eşleyicisi kullanabilirsiniz. Ayrıca, etki alanı nesneleri için uygun olmayan IExtensibleDataObject ve DataMemberAttributes gibi hizmete özgü özelliklere de sahip olacaklar. Bu, alan nesnelerinizin hizmetten gönderdiğiniz nesnelerden bağımsız olarak değişmesini sağlar.