Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Тип метода возвращающий комбинированный запрос? 
:(
    Опции темы
Laprado
Дата 25.2.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 24.5.2006
Где: Firefox

Репутация: нет
Всего: нет



Какого типа должен быть метод Search, чтобы вернуть комбинированный запрос?

Код

     class User
    {
        public string Name { get ; set; }
        public string Tel { get; set; }
        public string Address { get; set; }
        public string Email { get; set; }
    }

    class Admin
    {
        public string Name { get; set;}
        public string Address { get; set; }
    }

    class Telephone
    {
        private List<User> users = new List<User>();
        private List<Admin> admins = new List<Admin>();

        public void Add(string uName, string uTel, string uAddress, string uEmail)
        {
            users.Add(new User { Name = uName, Tel = uTel, Address = uAddress, Email = uEmail });
            admins.Add(new Admin { Name = uName, Address = "TestAddr" });
        }

        public IEnumerable<User> Search(string uName)
        {
            var usersch =
                (from user in users
                where user.Name== uName
                select user).Concat(from admin in admins
                                    where admin.Name == uName
                                    select admin);

            return usersch;
        }
    }

--------------------
PM MAIL   Вверх
1stain
Дата 25.2.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 1
Всего: 40



убери класс Admin и добавь в класс User свойство IsAdmin.


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
Laprado
Дата 26.2.2009, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 24.5.2006
Где: Firefox

Репутация: нет
Всего: нет



Это конечно вариант. Но как вернуть значение выборки из 2х списков? Или никак?
--------------------
PM MAIL   Вверх
jonie
Дата 26.2.2009, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: нет
Всего: 118



взять отладчик и посмотреть тип (вернуть его в var переменную) или вывести GetType() - там тип пишется (в ужасном формате, но все же)...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
1stain
Дата 26.2.2009, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 1
Всего: 40



Цитата(Laprado @  26.2.2009,  08:17 Найти цитируемый пост)
Это конечно вариант. Но как вернуть значение выборки из 2х списков? Или никак?

ты думать умеешь? зачем тебе два списка, если объекты будут одного класса?


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
PashaPash
Дата 26.2.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 4
Всего: 49



Цитата(Laprado @  26.2.2009,  08:17 Найти цитируемый пост)
Но как вернуть значение выборки из 2х списков? Или никак? 

Какой выборки? компилятор обругает тебя еще при попытке сделать Concat - можно комбинировать только запросы над однотипными объектами.


--------------------
PM MAIL WWW   Вверх
Laprado
Дата 27.2.2009, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 24.5.2006
Где: Firefox

Репутация: нет
Всего: нет



PashaPash, Это пример из книги по LINQ. Видимо не обругает и не ругает smile

1stain
Видимо тут думать не умею не я smile Объекты у меня не будут одного класса. Нужно так, как в примере.

Этот пример хорошо работет, если выполнять его в методе и обрабатывать результат в этом же методе. Но стоит переместить выполение в отдельный метод, как возникает вопрос о типе возвращаемых данных. 


Это сообщение отредактировал(а) Laprado - 27.2.2009, 13:31
--------------------
PM MAIL   Вверх
PashaPash
Дата 27.2.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 4
Всего: 49



Цитата(Laprado @  27.2.2009,  13:20 Найти цитируемый пост)
PashaPash, Это пример из книги по LINQ. Видимо не обругает и не ругает smile

На этот пример студия 2008 SP 1 говорит:
Error    1    The type arguments for method 'System.Linq.Enumerable.Concat<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Collections.Generic.IEnumerable<TSource>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

Хотя у тебя каким-то чудом компилируется. Ты код точно привел?


--------------------
PM MAIL WWW   Вверх
diadiavova
Дата 2.3.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: нет
Всего: 142



Laprado, а почему не сделать как-нибудь так
Код

    public abstract class Client
    {
        public string Name { get; set; }
        public string Address { get; set; }
        public virtual string TypeName
        {
            get 
            {
                return this.GetType().Name.ToLower();
            }
        }
    }
    
    class User:Client
    {
        public string Tel { get; set; }
        public string Email { get; set; }
    }
    class Admin: Client
    {
    }
    class Telephone
    {
        private List<Client> _clients = new List<Client>();
        public List<Client> Clients
        {
            get
            {
                return _clients;
            }
        }
        public List<Client> Search(string uName)
        {
            return _clients.FindAll(cl=>cl.Name==uName);
        }
    }


Ведь масса проблем решается. Если надо получить с писок админов, то
Код

_clients.FindAll(cl=>cl.TypeName=="admin");

итд. Никакогого дублирования данных(как в методе Add), вся функциональность коллекции доступна, кроме того: если ты захочешь ввести новую категорию клиентов - тебе не придётся переписывать весь код, произведёш новый класс от Client и всё.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




[ Время генерации скрипта: 0.0757 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.