Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LINQ (Language-Integrated Query) > Тип метода возвращающий комбинированный запрос?


Автор: Laprado 25.2.2009, 11:34
Какого типа должен быть метод 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;
        }
    }

Автор: 1stain 25.2.2009, 20:20
убери класс Admin и добавь в класс User свойство IsAdmin.

Автор: Laprado 26.2.2009, 08:17
Это конечно вариант. Но как вернуть значение выборки из 2х списков? Или никак?

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

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

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

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

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

Автор: Laprado 27.2.2009, 13:20
PashaPash, Это пример из книги по LINQ. Видимо не обругает и не ругает smile

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

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

Автор: PashaPash 27.2.2009, 15:44
Цитата(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.

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

Автор: diadiavova 2.3.2009, 12:12
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 и всё.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)