2009-09-03 5 views
2

J'ai un modèle de données simple de deux tables, le courrier électronique et les destinataires, le courrier électronique peut être envoyé à un ou plusieurs destinatairesMVC LINQ to SQL JOIN pour le type personnalisé échoue pour une vue fortement typé

J'ai installé la base de données les deux tables, créé le référentiel Linq to SQL, construit les contrôleurs et la vue fortement typée.

Cela fonctionne bien quand je veux sélectionner tous les enregistrements de la base de données

public IList<AllMailDetail> ListAll() 
    { 
     var allMail = 
      from m in _datacontext.mail_receiveds 
     join r in _datacontext.mail_recipients on m.DeliveryId equals r.DeliveryId 
      select new AllMailDetail { 
             DeliveryId = m.DeliveryId, 
             MessageId = m.MessageId, 
             SentFrom = m.SentFrom, 
             FilePath = m.FilePath, 
             FileName = m.FileName, 
             SentDateTime = m.SentDateTime, 
             ReceivedDateTime = m.ReceivedDateTime, 
             Subject = m.Subject, 
             SpamScore = m.SpamScore, 
             IsSpam = m.IsSpam, 
             SenderIP = m.SenderIP, 
             Header = m.Header, 
             SentTo = r.SentTo 
             }; 

     return allMail.ToList <AllMailDetail>(); 
    } 

La classe type personnalisé

public class AllMailDetail 
{ 
    public int DeliveryId { get; set; } 
    public int? MessageId { get; set; } 
    public string SentFrom { get; set; } 
    public string FilePath { get; set; } 
    public string FileName { get; set; } 
    public string SentDateTime { get; set; } 
    public DateTime ReceivedDateTime { get; set; } 
    public string Subject { get; set; } 
    public byte? SpamScore { get; set; } 
    public bool? IsSpam { get; set; } 
    public string SenderIP { get; set; } 
    public string Header { get; set; } 
    public string SentTo { get; set; } 
} 

Le contrôleur envoie simplement le contenu du référentiel à la vue fortement typé

public ActionResult Index() 
    { 
     return View(_repository.ListAll()); 
    } 

Pour obtenir un seul enregistrement de courrier de la base de données j'ai le code suivant qui accepte un deliveryId

public IQueryable<AllMailDetail> GetMail(int? id) 
    { 
     var allMail = 
      from m in _datacontext.mail_receiveds 
      join r in _datacontext.mail_recipients 
      on m.DeliveryId equals r.DeliveryId 
      where m.DeliveryId == id 
      select new AllMailDetail 
      { 
       DeliveryId = m.DeliveryId, 
       MessageId = m.MessageId, 
       SentFrom = m.SentFrom, 
       FilePath = m.FilePath, 
       FileName = m.FileName, 
       SentDateTime = m.SentDateTime, 
       ReceivedDateTime = m.ReceivedDateTime, 
       Subject = m.Subject, 
       SpamScore = m.SpamScore, 
       IsSpam = m.IsSpam, 
       SenderIP = m.SenderIP, 
       Header = m.Header, 
       SentTo = r.SentTo 
      }; 

     return allMail; 
    } 

Et son code contrôleur

public ActionResult Details(int? id) 
    {  
     var mail = _repository.GetMail(id); 

     if (mail == null) 
      return View("NotFound"); 

     return View(mail); 
    } 

J'avais essayé d'afficher la sortie pour un seul enregistrement en utilisant également une vue fortement typé ayant un système Inherits = ". Web.Mvc.ViewPage en haut de la page ASPX mais j'ai eu l'erreur suivante

l'élément de modèle passé dans le dictionnaire est de type « System.Data.Linq.DataQuery`1 [projectMail.Models.AllMailDetail ] 'bu t ce dictionnaire nécessite un élément de modèle de type projectMail.Models.AllMailDetail '.

je fixe cette erreur après beaucoup de recherches et trouvé ce poste le plus utile MVC LINQ to SQL Table Join Record Display

donc mon avis n'est plus fortement typé et je construis la page comme suit

<% foreach (projectMail.Models.AllMailDetail item in (IEnumerable)ViewData.Model) 
    { %> 

     ...items... 

<% } %> 

Cela fonctionne bien , mais il semble que ce soit long. La chose que je ne peux pas comprendre est

  1. Pourquoi la seconde requête doivent être IQueryable
  2. Pourquoi ne pas fonctionner lorsque la vue a été fortement typé
  3. Comment peut-il être fait de travailler avec une vue fortement typé
  4. Est-ce la meilleure façon de traiter avec des jointures dans MVC en utilisant LINQ to SQL

Répondre

3

Hmmmm, dans le contrôleur Essayez

return View(_repository.GetMail(id).SingleOrDefault()); 

Vous essayez de lier une source de données IQueryable à une vue AllMailDetail, ce qui précède devrait vous corriger.

+0

Oui, cela a fonctionné, une idée sur les autres parties de la question? – best

+0

La deuxième requête n'a pas besoin d'être IQueryable, seulement si vous voulez être en mesure d'exécuter plus de LINQ après que cette fonction a renvoyé des données. La façon dont vous faites les jointures est très bien, – TWith2Sugars

Questions connexes