2016-04-12 4 views
-1

Ich habe gesehen, dies in Code einmal oder zweimal getan, aber jetzt kein Beispiel finden. Bis vor kurzem arbeitete ich in Webforms und bin zu MVC gewechselt. Ich habe mich umgesehen und nicht viel gefunden. Der unten stehende Code stammt von meinem Controller, um die Werte einzublenden und in meinem Ansichtsmodell anzuzeigen. Ich muss die m.body.MembersId von MSMQ nehmen. Ich weiß, was das Problem ist, ich weiß nicht, wie man Linq so benutzt.Casting und Verkettung in einer Zeile

Die Situation, ich muss das alles in einer Linie tun. Werfen Sie die memberIds-Informationen, die ursprünglich eine Liste mit dem Namen MembersId waren, zurück in eine Liste, um sie anzuzeigen, aber führen Sie auch eine string.join-Anweisung aus, sodass die gesamte Liste als eine Zeichenfolge angezeigt wird. Während ich mir bewusst bin, wie ich beides alleine machen kann, aber in einer Linie zu tun, bewies mich. Ich werde offen zugeben, dass ich linq ziemlich neu bin und lerne, während ich gehe. Dies ist die Klasse

public class MsgChildClass{ 
    public string SourceSystem { get; set; } 
    public List<string> MemberIds { get; set; } 
    public string ParentId { get; set; } 
    public string Error { get; set; } 
} 

dies die Funktion

ist
public ActionResult GetAllMessages() { 

     string queueName = (ViewBag.QueueName != null) ? ViewBag.QueueName : Request.QueryString["queueName"]; 
     Session["CurrentQueueName"] = queueName; 
     TempData["queueName"] = queueName; 
     ViewBag.QueueName = queueName; 

     var queue = _Queues[queueName]; 

     queue.MessageReadPropertyFilter.ArrivedTime = true; 
     queue.MessageReadPropertyFilter.Body = true; 
     queue.Formatter = new JsonMessageFormatter(); 

     var messages = queue.GetMessages(); 

     var model = messages.Select(m => 
        new ViewModel() { 
         Id = m.Id, 
         Date = m.ArrivedTime, 
         SourceSystem = ((MsgChildClass)m.Body).SourceSystem, 
         DeletedMemberIds = ((MsgChildClass)m.Body).DeletedMemberIds,//OrderByDescend(x => x);    string.Join(",",((MsgChildClass)m.Body).DeletedMemberIds), 
         ParentMemberId = ((MsgChildClass)m.Body).ParentId, 
         Error = ((MsgChildClass)m.Body).Error, 
         QueName = queueName 
        }).ToList(); 
     return Json(model.ToList(), JsonRequestBehavior.AllowGet); 
     } 

Ansicht Modell

public class ViewModel 
{ 
    [Required] 
    public string Id { get; set; } 

    //[Required] 
    [Display(Name = "Arrival Time")] 
    public DateTime Date { get; set; } 

    [Required] 
    [Display(Name = "Source System")] 
    public string SourceSystem { get; set; } 

    [Required] 
    [Display(Name = "Member Ids")] 
    public List <string> MemberIds { get; set; } 


    [Required] 
    [Display(Name = "Parent Member Id")] 
    public string ParentMemberId { get; set; } 

    [Display(Name = "Error")] 
    public string Error { get; set; } 

    [Display(Name = "QueName")] 
    public string QueName { get; set; } 



} 

Dies ist, was ich habe. Alles funktioniert korrekt außer den Members. Das Debugging zeigt mir, dass die Members den Wert haben, aber ich bohre nicht weit genug. Also hoffentlich kann mir jemand ein wenig helfen, da es an diesem Punkt recht wenige Stunden waren. Google ist großartig, aber er hat mir nicht geholfen.

+4

Sind Sie sicher, dass es nicht nur ein Tippfehler ist? Sie vermissen ein ',' nach '((MsgChildClass) m.Body) .MemberIds'. –

+0

@Joel Von welchem ​​Typ ist '((MsgChildClass) m.Body) .MemberIds'? Was ist falsch an deinem aktuellen Code? – har07

+0

@AlexanderDerck das war nur ein Tippfehler von der Kopie und Paste Entschuldigung darüber – Joel

Antwort

0

Der Code war korrekt, was der irreführende Teil war. Debugger sagte mir die Werte waren da. Aber der Teil, den ich nicht angesehen habe, war, wie die datatable.js die Daten zur Anzeige geladen hat. Nachdem ich gesehen habe, dass das falsch gemacht wurde, habe ich es korrigiert und jetzt wird die Liste nun als String, String, String angezeigt, was ich brauchte, also danke jeder

0

Es ist sauberer und effizienter, wenn Sie nur einmal in eine Variable umwandeln. Und ein weiterer Vorteil ist, dass Sie einen Haltepunkt hinzufügen und msgChild betrachten können.

var model = messages.Select(m => 
{ 
    var msgChild = (MsgChildClass)m.Body; 

    return new ViewModel 
    { 
     Id = m.Id, 
     Date = m.ArrivedTime, 
     SourceSystem = msgChild.SourceSystem, 
     MemberIds = msgChild.MemberIds, 
     ParentMemberId = msgChild.ParentId, 
     Error = msgChild.Error, 
     QueName = queueName 
    }; 
}).ToList(); 
+0

Ich habe mehr Code bearbeitet und gezeigt. Um die Situation etwas besser zu erklären als ich – Joel