2016-04-19 3 views
0

abgerufen werden Ich verwende Stored Procedure in Entity Framework. Ich erhalte Eltern Wert und dessen Kind durch @id Parameter leicht, aber dieses Mal will ichWie Eltern- und Kindtabellendatum aus Stored Procedure in Entity Framework

eine Liste der übergeordneten Tabelle Objekt und Kind von jedem Elternteil Objekt erhalten, wie dieses Bild

enter image description here

 var command = myContext.Database.Connection.CreateCommand(); 
      command.CommandText = "[dbo].[GetNewsForUser] @id"; 
      command.Parameters.Add(new SqlParameter("@id", "9f13f132-4536-4111-a73e-61a97a52d226")); 

      try 
      { 
       myContext.Database.Connection.Open(); 
       var reader = command.ExecuteReader(); 

       var objectContext = ((IObjectContextAdapter)myContext).ObjectContext; 


       UserNews.UserName = objectContext.Translate<string>(reader).FirstOrDefault(); 

       // to get nex select set from Stored Procedure 
       reader.NextResult(); 

       UserNews.NewsInfos = objectContext.Translate<NewsInfo>(reader).ToList(); 
      } 
      finally 
      { 
       myContext.Database.Connection.Close(); 
      } 
     } 


CREATE Procedure GetNewsForUser 

@id nvarchar(50) 
as 

BEGIN 

select UserName from AspNetUsers where id= @id 
select NewsId, NewsTitle from News where UserId = @id 
End 

Bitte helfen Sie mir meine C# -Code und t-sQL zu ändern LIST des übergeordneten Tabelle Objekts und Kind von jedem Elternteil Ziel zu erreichen

ich mag mit Daten diese füllen

 IList<GetAllNewsForUser> li = null; 
     GetAllNewsForUser g = new GetAllNewsForUser(); 
     g.UserName = ""; 
     g.NewsInfos = null; 
     li.Add(g); 

Danke

Antwort

0

Was Sie brauchen Join-Abfrage zwischen AspNetUsers Tisch und News-Tabelle. Dann müssen Sie das Set bestellen. Sobald Sie den Satz in einer Liste haben, können Sie ihn an ein Gitter binden, das nach Benutzernamen gruppiert ist, oder Sie können die Menge, die das verwendete Präsentationsobjekt ausfüllt, einfach durchgehen. Schauen Sie durch den folgenden Code:

SELECT UserName, NewsId, NewsTitle 
FROM AspNetUsers u JOIN News n 
     ON u.Id = n.UserId 
Order by UserName, NewsTitle 

Schleife durch die oben aufgeführte Liste ändert Gruppe jedes Mal der Benutzername ist anders

var userNewsList = repository.GetAllUserNews(); 

foreach(var item in userNewsList) 
{ 
    if(userName != item.UserName) 
    { 
     //print the userName only once 
    } 

    //print the NewsTitle and NewsId 
} 

Möglicherweise müssen Sie eine neue Entität erstellen, die das Ergebnis der Abfrage, wenn Sie festgelegt Spiele Ich hab keinen. Nehmen wir an, der Entitätsname ist UserNews. Dann folgt

var resultSet = objectContext.Translate<UserNews>(reader); 

Das Übersetzen Methode eine Objectzurückgibt, können Sie dann die Schleife durch diesen Satz (resultSet) unter Verwendung von Code wie in diesem Beispiel: https://msdn.microsoft.com/en-us/library/bb738847(v=vs.110).aspx

Sie einen Wörterbuch verwenden können, die Möglichkeit, die Daten zu laden Sie wollen.

usersLi = objectContext.Translate (Leser) .ToList(); var newsContainer = new Dictionary()

foreach (var item in usersLi) 
{ 
    if(!newsContainer.ContainsKey(item.Username)) 
    { 
     newsContainer.Add(item.UserName, new List<NewsInfo>());  
    } 

    var newsInfo = new NewsInfo(); 

    newsInfo.NewsTitle = item.Title; 
    newsInfo.NewsId = item.Id; 

    newsContainer[item.UserName].Add(newsInfo); 
} 

Die newsContainer.Keys gibt Ihnen die Benutzernamen, newsContainer [Benutzername] gibt Ihnen die Liste der NewsInfo.

+0

Vielen Dank für Ihre Hilfe, aber wie kann ich mein Geschäftsobjekt aus der gespeicherten Prozedur füllen? so UserNews.UserName = objectContext.Translate (Leser) .FirstOrDefault(); // nex select aus gespeicherter Prozedur erhalten reader.NextResult(); UserNews.NewsInfos = objectContext.Translate (Leser) .ToList(); IList li = null; GetAllNewsForUser g = Neu GetAllNewsForUser(); g.UserName = ""; g.NewsInfos = null; li.Add (g); – Lucia

+0

Ich habe die obige Antwort bearbeitet, um Ihre Frage zu beantworten. – ErnestoDeLucia

+0

Nun, ich möchte die Newsliste jedem Benutzer wie folgt zuweisen: usersLi = objectContext.Translate (Leser).Auflisten(); foreach (var Element in usersLi) { GetAllNewsForUser ii = Neu GetAllNewsForUser(); ii.UserName = item.UserName; ii.NewsInfos = item.NewsInfos; FinalList.Add (ii); } – Lucia