2015-07-02 20 views
6

Tek bir sorgu kullanarak veritabanı karmaşık nesnesinden almak istiyorum.Karma nesneler varlık SQL'de SQL sorgusuyla getirme

SELECT TableA.*, TableB.* 
FROM TableA 
INNER JOIN TableA.B_Id = TableB.Id 

ve ilgili sınıfları: en aşağıdaki örneğe bakalım

public class QueryResult 
{ 
    public TableA A { get; set; } 
    public TableB B { get; set; } 
} 

public class TableA 
{ 
    public int Id { get; set; } 
    public string SomeContentA { get; set; } 
    public int B_Id { get; set; } 
} 

public class TableB 
{ 
    public int Id { get; set; } 
    public int SomeContentB { get; set; } 
} 

Ben veritabanına karşı yukarıdan ham SQL sorgusu çalıştırmak ve doğru olarak A set ile QueryResult toplanması nesneleri almak istiyorum ve B özellikleri. Şimdiye kadar sqlquery yöntemini kullanarak çalıştı, ama sadece QueryResult toplanması A'da nulls ve oda özellikleri (görünüşte döndü sonuç kümesi doğru özelliklerine binded değildi) ile nesneleri başardı:

var results = ctx.Database.SqlQuery<QueryResult>(\\example_query).ToList(); 

Not olun:

  • SELECT ifadesinde manüel sütunları listelememeliyim. TableA ve TableB sınıfları ve SQL tabloları zamanla değişebilir, ancak bu değişiklikler tutarlı olacaktır.
  • Üç sorgu (biri TableA ve TableB'den ID'ler almak, ikincisi TableA'dan nesne almak için ikinci, TabloB'den nesneler için üçüncü) performansa zarar verir ve mümkünse bundan kaçınmayı denemeliyim.

Ben Entity Framework 4.3 ve SQL Server 2012.

sayesinde Sanat kullanıyorum

+0

'B_Id' buradaki gerçek bir yabancı anahtardır? Öyleyse, tablonuzda "TableB" ye başvurmamanızın bir nedeni var mı? Böylece, ham SQL'i kullanmak yerine EF yoluyla yükleyebilirsiniz. – Thewads

+0

Hayır, öyle değil, birleştirme kullanmak için örneğe ekledim. Karışıklık için özür dilerim. Asıl problemde, Tablo A ve Tablo B arasında bir ilişki yoktur ve bu kodu, normal EF yapılarıyla değiştirmenin bir seçeneği yoktur. –

+0

EF4.x'i kullanmanın bir nedeni var mı? 6.x'e yükseltmeyi düşündünüz mü? Ayrıca, karmaşık birleştirme gerçekleştirmek için DB'de bir SProc oluşturmak için erişiminiz var mı? – GoldBishop

cevap

0

Hala sadece bunlara karşılık gelen tablolarıyla sınıfları haritalama ve katılmak zorlayarak düzenli EF yapılar kullanabilirsiniz LINQ-To-Varlıkları:

using(var ctx = new MyDbContext()) 
{ 
    return ctx.TableA 
     .Join(ctx.TableB, a=>a.B_Id, b=>b.Id, (a,b)=> 
       new QueryResult{TableA=a, TableB=b}); 
} 

Ben en azından Ef6 kadar tek yol olduğunu düşünüyorum.

İlgili konular