Объединение LINQ с постоянными значениями

Очень примитивный вопрос, но я застрял (наверное, новичок). У меня есть функция, которая должна отправить мне список компаний: ТАКЖЕ, я хочу, чтобы вызывающий абонент мог также указать верхний элемент для раскрывающегося списка.. (скажем, для «Нет»). У меня есть следующий фрагмент кода, как я добавлю верхний элемент к возвращаемому SelectList?

    public static SelectList GetCompanies( bool onlyApproved, FCCIEntityDataContext entityDataContext, SelectListItem TopElement )
    {
        var cs = from c in entityDataContext.Corporates
                 where ( c.Approved == onlyApproved || onlyApproved == false )
                 select new
                 {
                     c.Id,
                     c.Company
                 };

        return new SelectList( cs.AsEnumerable(), "Id", "Comapny" );
    }

Спасибо!


person effkay    schedule 05.12.2009    source источник
comment
@Mark Byers: спасибо за решение в течение 20 минут! действительно ценится.   -  person effkay    schedule 05.12.2009


Ответы (4)


Это должно сработать для вас:

List<Corporate> corporates =
            (from c in entityDataContext.Corporates
            where (c.Approved == onlyApproved || onlyApproved == false)
            select c).ToList();
corporates.Add(new Corporate { Id = -1, Company = "None" });

return new SelectList(corporates.AsEnumerable(), "Id", "Comapny");
person Mark Byers    schedule 05.12.2009
comment
очень сложно... код скомпилирован; тестирование сейчас; опубликовать обновление после подтверждения..... спасибо. - person effkay; 05.12.2009
comment
РЕКОМЕНДАЦИЯ: Последний выбор в переменную cs не требуется - можно передать корпорацию прямо в конструктор SelectList... - person effkay; 05.12.2009
comment
Спасибо. Теперь я удалил последний выбор. - person Mark Byers; 05.12.2009

Этот метод всегда работал для меня.

public static SelectList GetCompanies( bool onlyApproved, FCCIEntityDataContext entityDataContext, SelectListItem TopElement )
    {
            var cs = from c in entityDataContext.Corporates
                             where ( c.Approved == onlyApproved || onlyApproved == false )
                             select new SelectListItem {
                                     Value = c.Id,
                                     Text = c.Company
                             };

            var list = cs.ToList();
            list.Insert(0, TopElement);

            var selectList = new SelectList( list, "Value", "Text" );
            selectList.SelectedValue = TopElement.Value;

            return selectList;
    }

Обновление забыл урок, который я усвоил, когда делал это. Вы должны вывести LINQ как SelectListItem.

person Nick Berardi    schedule 05.12.2009
comment
Лучшее соответствие перегруженного метода для «System.Collections.Generic.List‹AnonymousType#1›.Insert(int, AnonymousType#1)» имеет некоторые недопустимые аргументы И аргумент «2»: невозможно преобразовать из «AnonymousType#2» в «AnonymousType». №1'. Наверное, я забыл указать, что entityDataContext.Corporates - это класс LINQ to SQL... Компилятор не разрешает добавление анонимного типа.... - person effkay; 05.12.2009

Вы можете преобразовать его в список, как указано, или вы можете объединить результат IQueryable с постоянным массивом из одного элемента (и даже отсортировать его):

    static void Main(string[] args)
    {
        var sampleData = new[] {
            new { Id = 1, Company = "Acme", Approved = true },
            new { Id = 2, Company = "Blah", Approved = true }
        };

        bool onlyApproved = true;

        var cs = from c in sampleData
                 where (c.Approved == onlyApproved || onlyApproved == false)
                 select new
                 {
                     c.Id,
                     c.Company
                 };

        cs = cs.Union(new [] {new { Id = -1, Company = "None" }}).OrderBy(c => c.Id);

        foreach (var c in cs)
        {
            Console.WriteLine(String.Format("Id = {0}; Company = {1}", c.Id, c.Company));
        }

        Console.ReadKey();
    }
person Donald Byrd    schedule 05.12.2009

person    schedule
comment
TopElement - это SelectListItem, он содержит только значение и текст. - person Nick Berardi; 05.12.2009