我在实体框架中使用存储过程。我很容易通过@id参数得到父值和它的子,但这次我想获得父表对象的LIST和每个父对象的子句
喜欢这张图片
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 :(得分: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列表。