我正在使用NerdDinner作为我的第一个MVC / LINQ to SQL项目的指南。它讨论了当View需要来自多个源的数据时ViewModel模式的使用 - 在他们的示例中:Dinners和Countries(用作下拉列表)。
在我的应用程序中,问题有点不同。它不是那么多不同的数据,而是通过关键约束链接的数据。我有一个Story表,通过UserId键链接到aspnet_users。我希望能够轻松访问每个故事的UserName。
由于我正在使用存储库模式并在某些情况下返回IQueryable以进行延迟执行,因此我正在努力使用正确的方式来整形数据。所以我现在正在使用这个VideModel模式使其工作,但不确定它是否正确。
我没有回复IQueryable Story(因为我需要UserName而无法工作),而是返回一个新的自定义类UserStory,它有一个Story属性和一个字符串Username属性。
你有什么想法?
答案 0 :(得分:1)
似乎你的问题与MVC关系不大,因为它只是一个关于如何根据用户名字符串访问故事数据的问题。
是否可以在数据库中创建一个包含所有UserStory数据,用户名以及用户ID的视图?这样,您可以根据您拥有的用户名从视图中进行选择。
要创建视图,您只需根据用户ID在用户表和用户表之间进行连接。
之后,您仍然可以使用存储库模式并返回IQueryable。
如果您想要进行更新,那么操作很简单,因为您仍然拥有用户ID,并且能够链接回需要更新的实际表。
答案 1 :(得分:0)
使用存储库模式并返回IQueryable of Stories很好。该关系允许您访问类似这样的用户名值>>
假设您在模型对象中返回IQueryable:
foreach(Story story in Model.Stories)
{
// do something with the value
response.write(story.aspnet_user.UserName);
};
您的Repository方法如下所示:
public List<Stories> GetStories(Guid UserId)
{
return datacontext.Stories.Where(u => u.UserId = UserId).ToList();
}
该关系将自动为您提供对我首次提到的foreach循环中的UserName值的访问权限。不需要了。
我不确定为什么你的分页控制在Count()上失败了?不过??
希望这有帮助
答案 2 :(得分:0)
如果你看看Kigg,你会看到他们搞乱了初始模型以创建自定义ViewModel。这是NerdDinner没有详细介绍的内容。您可以创建一个继承自Stories的StoriesWithUserName类,但添加一个新属性 - UserName。然后将其返回到您的View,该视图将继承自IEnumerable&lt; StoriesWithUserName&gt;
[编辑]
糟糕。没有发现你已经这样做了:o)