2015-11-13 6 views
0

Я работаю над одним приложением, которое имеет трехуровневую архитектуру с использованием модуля EF Code First.Как назначить список вывода ListView в многоуровневой архитектуре C# 3

  1. UI Layer (UI)
  2. Business Logic Layer (BLL)
  3. Доступ к данным Layer (DAL)

Использование LINQ я извлечения данных из базы данных в DAL, и передавая ее BLL и от BLL до UI

Ex.

В DAL

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

в УСК

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

и в пользовательском интерфейсе - Присвоение списка пользователей к 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 «объект» не содержит определения для «ToList», и не может быть найден метод «ToList», принимающий первый аргумент типа «объект» (вам не хватает директивы using или ссылки на сборку?)

Может ли кто-нибудь сказать мне, как показать вывод в ListView? Он работает отлично с DataGridView, как показано ниже -

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

Почему бы не создать 'пользователей type' и возвращает общую коллекцию что тип, а не передача объекта? Ваша ошибка находится на 'users.ToList()' line cz, вы не можете вызывать 'ToList()' для объекта. Ошибка –

ответ

2

Когда вы возвращаете users из ваших методов, он бросает к object .so при вызове метода ToList(), в object «s ссылки не существует, что method.You должен бросить его обратно к вашему объекта, тип.И потому, что у вас есть анонимный тип, вам нужно создать свой собственный класс с полями 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; 
} 

в УСК

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

и в пользовательском интерфейсе - Присвоение списка пользователей к 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 })) 
       ); 
+0

Hi Suren - у меня есть класс' User' уже для этих полей, когда я использую 'List ' и возвращаю 'users' он говорит> Невозможно неявно преобразовать тип 'System.Collections. Generic.List 'to' System.Collections.Generic.List ' –

+0

@Rajendra, что он говорит? –

+0

Как и мне нужно импортировать ссылку Data ('User') на слой BLL, который, как я полагаю, нарушает правило из 3-х многоуровневой архитектуры, не уверен. У меня есть разные проекты для UI (Winform), BLL (Class Library), DAL (Class Library) и Data (Class Library) –

-1

Добавить ссылку на System.Linq для неисправного проекта.

+0

должна происходить в строке 'users.ToList()', потому что 'users' является объектом, и вы не можете вызывать' ToList() 'для объекта. Импорт 'System.Linq' не поможет. –

+0

System.Linq не является сборкой и не может быть добавлен в качестве ссылки. Это пространство имен. И сборка, которая содержит is - 'System.Core' –

Смежные вопросы