2013-08-29 65 views
6

Stajım için arka planda bir veritabanı ile iletişim kuran bir program oluşturuyorum. Program, MVC (Model-Görünüm-Denetleyici) yolunda katmanlandırılmıştır.Nesne Yönlendirmeli Linq2Sql sorgu sınıfı

Görünüm İçin Verilere DataAccesLayer (DAL) adını verdiğim bir şeyle erişmek istiyorum. Bu görünüm çok az bilgiye sahip olduğundan, aramak istediğim sorgu için bir kimlik iletilmesini istiyorum. Çağrı DAL içinde yapılacaktır. Sonra ID ile sorguyu geri döndürmek için sorguları tutan bir sınıf sormak istiyorum, sonra DAL içinde yürütmek. Görselleştirmek için resim.

enter image description here

Şimdi sahip sorun benim Oku işlevinde sorguyu yürütmek için nasıl.

public class DataAccesLayer 
{ 
    private Queries queryloader; 
    private RoadsoftDigitacV8DataContext db; 

    public DataAccesLayer() 
    { 
     queryloader = new Queries(); 
     db = new RoadsoftDigitacV8DataContext(); 
    } 

    public List Read(int ID) 
    { 
     IQueryable query; 
     query = queryloader.GetQuery(ID); 

     return query.ToList(); 

    } 

} 

Sorgular sınıf için Kod:

public class Queries 
{ 
    private Dictionary<int, IQueryable object> queryDict; 
    private ErrorLoggerWinLog logger; 

    public Queries() 
    { 
     logger = ErrorLoggerWinLog.Instance(); 
     queryDict = new Dictionary<int, IQueryable object>(); 
     queryDict.Add(1, from d in db.Drivers 
         select d); 
    } 

    public object GetQuery(int ID) 
    { 
     var query; 
     if(queryDict.TryGetValue(ID, out query) == false) 
     { 
      logger.WriteLine("Queries", "Could not find the query specified", ErrorLoggerWinLog.loggerlevel.Error); 
     } 
     return query; 
    } 
} 

merak ediyorum, bu mümkün DAL için kod şudur? Şu an işe yaramıyor. Muhtemelen bir şeyi unutuyorum ya da önemli bir şeyi kaçırıyorum. Bu türden bir kurulumla ilgili herhangi bir deneyimi var mı, yoksa tamamen farklı bir çözüme mi bakmalı?

Düzenleme: Şu anda bu, sorguyu çalıştırıyor gibi görünmüyor. Datacontext buna rağmen doldurulur, bu programın farklı bir bölümünde yapılır.

Edit2: Şu anda İyon Kalıbına bakıyorum, bu harika bir öğrenme deneyimi, herkese yorum ve anwser için zaman ayırdığınız için teşekkür ederiz!

+0

İyi çaba, Resim için +1 = – Sean

+0

Ancak ..... Tam olarak ne çalışmıyor? – Sean

+0

Yine de db context nesnesini gerçek veritabanına bağlamanız gerekir. Şimdi sahip olduğunuz gibi, bağlantısız bir bağlam var. Ardından, sorguyu aslında bağlam üzerinden yürütmeniz gerekir. – ThaMe90

cevap

3

queryDict ürününüzün herhangi bir anda yalnızca bir öğesi vardır; GetQuery()'un yalnızca ve hata iletisini kaydetmediği tek zaman döndürmez, boşta 1'e geçtiğinizde. Sonuç olarak, Read(1) tüm Sürücülerin bir listesini döndürür, aksi halde NullReferenceException atar, çünkü query boştur. Eğer genel bir çözüm istiyorsanız

public class DriversDAL 
    { 
     private RoadsoftDigitacV8DataContext db; 

     public DriversDAL() 
     { 
      db = new RoadsoftDigitacV8DataContext(); 
     } 

     public Driver GetDriver(int ID) 
     { 
      return db.Drives.Single(d => d.ID == ID); 
     } 

    } 

, bir jenerik Dao ve Depo desen kullanmalısınız:

Böyle bir şey kullanmalısınız soruyla

How To Create Generic Data Access Object (DAO) CRUD Methods with LINQ to SQL