如何从实体框架中的存储过程获取父表和子表日期

时间:2016-04-19 12:53:00

标签: c# sql-server entity-framework

我在实体框架中使用存储过程。我很容易通过@id参数得到父值和它的子,但这次我想获得父表对象的LIST和每个父对象的子句

喜欢这张图片

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

谢谢

1 个答案:

答案 0 :(得分: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。然后是

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

Translate方法返回一个ObjectResult,然后您可以使用此示例中的代码循环遍历此set(resultSet):https://msdn.microsoft.com/en-us/library/bb738847(v=vs.110).aspx

您可以使用词典以您希望的方式加载数据。

usersLi = objectContext.Translate(reader).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);
}

newsContainer.Keys为您提供userNames,newsContainer [username]为您提供NewsInfo列表。