【问题标题】:C# : MVC Viewmodel to access data from multiple tablesC#:MVC Viewmodel 访问多个表中的数据
【发布时间】:2016-04-10 05:11:47
【问题描述】:

我是 MVC 的新手。在我的应用程序中,我试图根据不同的参数搜索数据。数据存储在数据库中,并使用实体框架访问数据库。由于我需要将来自多个模型的数据显示到一个视图中,我决定使用 ViewModel 将两个类绑定在一起并显示数据。 这是我的代码 模型

[Table("User")]
public partial class User
{
    [Key]
    public int UserId { get; set; }

    [StringLength(50)]
    public string FirstName { get; set; }

    [StringLength(50)]
    public string LastName { get; set; }

    [StringLength(50)]
    public string Email { get; set; }

    public virtual LicenseTypeMaster LicenseTypeMaster { get; set; }
}

[Table("tblLicenseTypeMaster")]
public partial class LicenseTypeMaster
{
   Key]
    public int LicenseTypeId { get; set; }

    [StringLength(100)]
    public string LicenseTypes { get; set; }

    public int? LicenseCount { get; set; }
}

视图模型

public class UserLicenseTWRBinder
{
    VSLicenseDb db = new VSLicenseDb();


    public IEnumerable<User> GetUserDetail(string searchBy, string searchValue)
    {
        List<User> usr = new List<User>();
        public List<User> usr { get; set; };
        var query = (from u in db.Users
                     join ut in db.UserLicenseTypes
                         on u.UserId equals ut.UserId
                     join tl in db.ToolsLicenseTypes
                     on ut.ToolLicenseTypeId equals tl.ToolLicenseTypeId
                     join tm in db.LicenseTypeMasters
                     on tl.LicenseTypeId equals tm.LicenseTypeId
                     where u.FirstName == searchBy
                     select new 
                     {
                         FirstName = u.FirstName,
                         LastName = u.LastName,
                         Email = u.Email,
                         LicenseAllocated. = tm.LicenseTypes
                     }).ToList();
       return query;
    }
    }

我希望该方法从 User 模型返回 FirstName、LastName 和 Email,从 LicenseTypeMaster 模型返回 LicenseType。我不确定要将两个模型中的哪些属性包含到 ViewModel 中,以便它只能呈现所需的数据。还有方法的返回类型,以便它可以在控制器中访问,然后可以传递给视图。

请帮忙。

【问题讨论】:

  • 我认为您应该从视图模型中删除您的逻辑并将您的 GetUserDetail 放在其他类(业务层)中。另一个提示是,当您将 List 放入视图模型中时,您将数据层绑定到 View,这并不好。
  • @pooriataghizadeh 我应该把它放在控制器中吗?我想通过实例化视图模型类在控制器中调用它。
  • 你可以把你的函数放在你想要的每个地方,你可以通过实例化来调用它,但更好的方法是将你的逻辑放在其他层。并将您的逻辑与数据模型和视图(表示层)分开。 programmers.stackexchange.com/questions/246660/…
  • 已接受建议!

标签: c# asp.net-mvc asp.net-mvc-4 model asp.net-mvc-viewmodel


【解决方案1】:

您需要创建一个新类说 UserPoco 并包含所有要提取的字段

 public class UserPoco
 {
     public string FirstName {get;set}
     public string LastName {get;set}
     public string Email{get;set}
     public string LicenseAllocated {get;set}
 }

方法应该是这样的

public IEnumerable<UserPoco> GetUserDetail(string searchBy, string searchValue)
{
    List<User> usr = new List<User>();
    public List<User> usr { get; set; };
    var query = (from u in db.Users
                 join ut in db.UserLicenseTypes
                     on u.UserId equals ut.UserId
                 join tl in db.ToolsLicenseTypes
                 on ut.ToolLicenseTypeId equals tl.ToolLicenseTypeId
                 join tm in db.LicenseTypeMasters
                 on tl.LicenseTypeId equals tm.LicenseTypeId
                 where u.FirstName == searchBy
                 select new UserPoco
                 {
                     FirstName = u.FirstName,
                     LastName = u.LastName,
                     Email = u.Email,
                     LicenseAllocated. = tm.LicenseTypes
                 }).ToList();
   return query;
}

这就是我会做的。您可以向 poco 类添加任意数量的字段。 希望有帮助。

【讨论】:

  • 感谢您的解决方案。对我来说效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多