2010-01-06 43 views
5

I olan aşağıdaki iki tabloda (temel çizgi):- ASP.Net MVC

Tbl_CategoryType

İD LevelID Açıklama

Tbl_Levels ID Ad

Temel olarak, Tbl_Levels.Name verisine başvuruda bulunurken, Tbl_CategoryType tablosundaki tüm bilgileri sunmak istiyorum Tbl_CategoryType.LevelID numarasına göre.

Aşağıdaki gibi depomuzda bir birleştirme kullanmayı denedim; Ben bu yöntemi çağırdığınızda

public IQueryable GetAllTypesInCategory(int CatID) 
{ 
    return (from x in DBEntities.LU_LST_CategoryTypeSet 
      where x.CategoryID == CatID && x.Enabled == 1 
      join y in DBEntities.LU_LST_LevelSet on x.LevelID equals y.ID 
      select new {x, y}); 
} 

Ancak, bu Kategori veya Düzeyi ya tipine uymuyor olarak atayabilir hiçbir türü yoktur.

Bunu özel bir viewmodel aracılığıyla yapmam gerektiğini, ancak adımları anlayamadığımı varsayarım. senin linq açıklamada bu hattı kullanarak peşin

cevap

3

İki varlık arasında bir ilişki varsa, onu kullanarak ikinci türüne erişebilirsiniz. Bu durumda yapmanız gereken tek şey, ilişkilendirme verilerini yüklemek için Include() yöntemini kullanmaktır.

 public List<LU_LST_CategoryType> GetAllTypesInCategory(int CatID) 
     { 
      return (from x in DBEntities.LU_LST_CategoryTypeSet.Include("LU_LST_LevelSet") 
        where x.CategoryID == CatID && x.Enabled == 1 
        select x).ToList(); 
     } 

her LU_LST_CategoryTypeSet category için Than size bu işe yaramaz category.LU_LST_Level

+1

Teşekkürler, işe yaradı. – shif

4

yılında

Teşekkür:

select new {x, y} 

Eğer varlık türlerinden farklı bir türüdür yeni anonim tür, yaratıyor.

Sanırım EntityFramework veya bağlı anahtarlar oluşturmak için yabancı anahtar ilişkilerini otomatik olarak çözecek başka bir ağır çerçeve kullanmıyorsunuzdur. Eğer doğruysa, o zaman evet, bir ViewModel oluşturmalısınız.

Her varlıktan birini özellik olarak içeren basit bir sarmalayıcı sınıfı oluşturun. yerine anonim türleri oluşturmak yerine, MyViewModel türleri oluşturmak için Linq açıklamada Sonra

public class MyViewModel 
{ 
    public MyViewModel(LU_LST_CategoryTypeSet x, LU_LST_LevelSet y) 
    { 
     Category = x; 
     Level = y; 
    } 

    public LU_LST_CategoryTypeSet Category { get; set;} 
    public LU_LST_LevelSet Level { get; set; } 
} 

:

public IQueryable GetAllTypesInCategory(int CatID) 
{ 
    return (from x in DBEntities.LU_LST_CategoryTypeSet 
      where x.CategoryID == CatID && x.Enabled == 1 
      join y in DBEntities.LU_LST_LevelSet on x.LevelID equals y.ID 
      select new {x, y}); 
} 

Ardından modeli sınıfa sonuçlarını kopyalayın:

var listOfTypes = GetAllTypesInCategory(catID); 
    foreach (var item in listOfTypes) 
    { 
     var model = new MyViewModel(item.x, item.y); 

     //Do whatever with the model to get it to the view. 
    } 

sizin Görünüm kaynaklanan devralma yapın MyViewModel'den.

+0

çağırabilir. Anonim bir tür oluşturmalı ve daha sonra verileri MyViewModel koleksiyonuna kopyalamanız gerekir. – LukLed

+0

Oh, evet onun yöntemi bir IQueryable istiyor gibi görünüyor. Yer için teşekkürler. – womp

+0

Üzgünüm Entity Framework'ü kullandığımı söylemeyi unutmuşum. – shif