2016-04-19 4 views
0

Entity Frameworkでストアドプロシージャを使用しています。私は簡単に親の値と@idパラメータによって、その子を取得しますが、今回は私がこの絵Entity Frameworkのストアドプロシージャから親テーブルと子テーブルの日付を取得する方法

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 

よう

各親オブジェクトの親テーブルオブジェクトと子のリストを取得したいです私のC#コードとt-sqlを親テーブルオブジェクトと各親オブジェクトの子リストのLISTを達成するように変更してください。

私はこれらをデータで埋めたい

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

はあなたが必要なもの

答えて

0

がAspNetUsersテーブルとニュースのテーブル間のクエリを結合です、ありがとうございました。その後、セットを注文する必要があります。 C#コードでは、一度リスト内のセットを取得すると、それをユーザー名でグループ化されたグリッドにバインドすることができます。または、簡単にするために、使用しているプレゼンテーションオブジェクトのセットをループすることができます。以下のコードを見て:

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

ループを上記のリスト変更基を介して毎回ユーザ名が異なっている

var userNewsList = repository.GetAllUserNews(); 

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

    //print the NewsTitle and NewsId 
} 

あなたがもし、クエリから結果セットを一致する新しいエンティティを作成する必要があるかもしれませんひとつも無い。エンティティ名がUserNewsであるとします。 https://msdn.microsoft.com/en-us/library/bb738847(v=vs.110).aspx

あなたがデータに道をロードするために辞書を使用することができます。そして、翻訳の方法がたObjectResultを返す

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

、あなたは、このセット(たresultSet)をループこの例のようなコードを使用してすることができ、次のあなたは欲しい。

usersLi = objectContext.Translate(reader).ToList(); するvar newsContainer =新しい辞書()

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); 
} 

newsContainer.Keysはあなたのユーザ名を与え、newsContainer [ユーザー名]はあなたにNewsInfoのリストを与えます。

+0

ありがとうございましたが、私はビジネスオブジェクトをストアドプロシージャから埋めることができますか?このように UserNews.UserName = objectContext.Translate (リーダー).FirstOrDefault(); //ストアドプロシージャからnexセレクトセットを取得する reader.NextResult(); UserNews.NewsInfos = objectContext.Translate (リーダー).ToList(); IList li = null; GetAllNewsForUser g =新しいGetAllNewsForUser(); g.UserName = ""; g.NewsInfos = null; li.Add(g); – Lucia

+0

私はあなたの質問に答えるために上記の答えを編集しました。 – ErnestoDeLucia

+0

よく私はこのように各ユーザーにニュースリストを割り当てたい: usersLi = objectContext.Translate (リーダー)。ToList(); foreachの(usersLiにおけるVAR項目) {GetAllNewsForUser II =新しいGetAllNewsForUser()。 ii.UserName = item.UserName; ii.NewsInfos = item.NewsInfos; ; FinalList.Add(ii); } – Lucia

関連する問題