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
- Pourquoi la seconde requête doivent être IQueryable
- Pourquoi ne pas fonctionner lorsque la vue a été fortement typé
- Comment peut-il être fait de travailler avec une vue fortement typé
- Est-ce la meilleure façon de traiter avec des jointures dans MVC en utilisant LINQ to SQL
Oui, cela a fonctionné, une idée sur les autres parties de la question? – best
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