【问题标题】:How to assign a output list to ListView in c# 3 layered architecture如何在 c# 3 分层架构中将输出列表分配给 ListView
【发布时间】:2016-02-14 18:43:41
【问题描述】:

我正在开发一个使用 EF Code First 模块的具有三层架构的应用程序。

  1. UI 层 (UI)
  2. 业务逻辑层 (BLL)
  3. 数据访问层 (DAL)

我使用 LINQ 从 DAL 中的数据库中检索数据并将其传递给 BLL 并从 BLL 传递给 UI

例如

在 DAL 中

    public object ReadUsers()
    {
        var users = db.Users.Select(u => new { u.UserName, u.IsDisable, u.FullName, u.Descriprion }).ToList();
        return users;
    }

在 BLL 中

    public object ReadUsers()
    {
        return _userDAL.ReadUsers();
    }

在 UI 中 - 将用户列表分配给 ListView

        var users = _userBLL.ReadUsers();
        users.ToList()
            .ForEach(x => lvUserRoleGroup.Items.Add(
                new ListViewItem(
                    new string[] { x.UserName, x.IsDisable.ToString(), x.FullName, x.Descriprion }))
                );

但它抛出一个错误

错误 1“object”不包含“ToList”的定义,并且找不到接受“object”类型的第一个参数的扩展方法“ToList”(您是否缺少 using 指令或程序集引用?)

谁能告诉我如何在ListView 中显示输出?它与DataGridView 一起工作正常,如下所示 -

        var users = _userBLL.ReadUsers();
        dataGridView1.DataSource = users;

【问题讨论】:

  • 为什么不创建Type 用户并返回该类型的通用集合而不是传递对象?你的错误是在`users.ToList()`行cz你不能在一个对象上调用ToList()

标签: c# .net winforms entity-framework linq


【解决方案1】:

当您从您的方法返回users 时,它强制转换object。因此,当您调用 ToList() 方法时,object 的引用中没有该方法。您必须将其转换回为您的对象类型。而且因为您有匿名类型,所以您需要使用字段x.UserName, x.IsDisable.ToString(), x.FullName, x.Descriprion 和任何地方创建自定义类,而不是使用匿名类型您的 自定义类型,然后转换为 List<CustomClass>

的对象

或者像这样更改objects

这将是你的课程

class CustomClass
{
   public string UserName {get ;set ;}
   public bool IsDisable  {get ;set ;}
   public string FullName {get ;set ;}
   public string Description {get ;set ;}
}

在 DAL 中

public List<CustomClass> ReadUsers()
{
        var users = db.Users.Select(u => new CustomClass{ UserName = u.UserName, IsDisable = u.IsDisable, FullName = u.FullName, Description u.Descriprion }).ToList();
        return users;
}

在 BLL 中

public List<CustomClass> ReadUsers()
{
    return _userDAL.ReadUsers();
}

在 UI 中 - 将用户列表分配给 ListView

List<CustomClass> users = _userBLL.ReadUsers();

            users.ForEach(x => lvUserRoleGroup.Items.Add(
                new ListViewItem(
                    new string[] { x.UserName, x.IsDisable.ToString(), x.FullName, x.Descriprion }))
                );

【讨论】:

  • 嗨,Suren - 当我使用 List&lt;User&gt; 并返回 users 时,我已经为这些字段设置了一个类 User,它说 >不能隐式转换类型 'System.Collections.Generic.List' 到 'System.Collections.Generic.List'
  • @Rajendra 它说什么?
  • 以及我需要将数据的引用(User 类)导入到 BLL 层,我猜这违反了 3 层架构的规则,不确定。我有不同的 UI(Winform)、BLL(类库)、DAL(类库)和数据(类库)项目
  • 对于第一个错误。您仍在使用匿名类型。将其更改为用户类型(我在我的代码中显示)。第二个我不能说什么,因为我没有看到你的代码。我认为您必须将其添加到您的数据中
  • 要在类之间共享用户对象,请创建一个接口项目和一个IUser 接口。使用层之间的接口。 IList&lt;IUser&gt;.
【解决方案2】:

向失败的项目添加对 System.Linq 的引用。

【讨论】:

  • 错误必须发生在users.ToList() 行,因为users 是一个对象,您不能在对象上调用ToList()。导入 System.Linq 将无济于事。
  • System.Linq 不是程序集,不能作为参考添加。它是命名空间。包含的程序集是 - System.Core
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 2019-04-01
  • 2012-11-27
  • 1970-01-01
  • 2012-07-21
相关资源
最近更新 更多