2013-07-31 2 views
1

У меня есть база данных с столбцом: Год (nvarchar), и я хочу добавить значения этого столбца в dropbox, отсортированный по убыванию.Linq filter using List <int>

Это код, который я использую:

List<string>years = db.tbl1.Select(w => w.Year).Distinct().ToList(); 
years.reverse(); 
foreach (string year in years) { drop_years.Items.Add(year);} 

Это не работает, потому что неоспоримым строку у меня будет что-то вроде этого: 2012, 2010, 2009, 2011, и т.д ..

Если я использую:

List<int> years = db.tbl1.Select(w => w.Year).Distinct().ToList(); 

компилятор скажите мне, что не может immplicitly преобразовать тип .. < строка> в .. < Int> ...

Я являюсь продавцом, и я не знаю, как решить эту проблему. Не могли бы вы помочь?

Я пробовал об этом, но подобные темы с моим не помогли мне разобраться.

Чтобы управлять моей проблемы я использовал очень непрофессиональный метод:

var years = db.tbl1.Select(w => w.Year).Distinct(); 
    List<int> yearsList = new List<int>(); 
    foreach (string year in years) 
    { yearsList.Add(Convert.ToInt32(year)); } 
    yearsList.Sort(); //I used Sort() because doesn't work only with Reverse(); 
    yearsList.Reverse(); 

, но я знаю, что это не элегантное решение.

Заранее благодарю вас за помощь!

+0

Обратный() просто отменяет порядок, из которого он вышел из базы данных. Не гарантировано, что они выйдут на предварительную сортировку! Вам нужно будет вызвать SortBy или SortByDescending, чтобы получить требуемый заказ. Затем выполните соответствующий синтаксический анализ или бросок. У тебя это было почти так! –

+0

«2012, 2010, 2009, 2011» не является сортированным списком строк. Как говорит Эрик, вы просто не сортируете его из базы данных. Предполагая, что все ваши годы четыре цифры, вы сможете упорядочить их сортировку. Его только тогда, когда у вас есть разные числа цифр, которые возникают с номерами сортировки строк (например, 1, 10, 2, 3) – Chris

+0

Похоже, что в этом запросе тип должен быть конкретно числовым (ints в этом случае), а не строковым. Если бы мы знали существующий тип данных в базе данных года и какой тип конца должен быть, мы могли бы быть более явными в примере кода. –

ответ

0

Все, что вам нужно, это ваша первая линия изменилась на:

List<string>years = db.tbl1.Select(w => w.Year).Distinct().OrderBy(x=>x).ToList(); 

добавление порядка будет гарантировать, что содержание отсортировано, когда он выходит из базы данных, то, что вы иначе не делать.

Более аккуратно вы можете использовать OrderByDescending, а затем опустить Reverse, что вы сделаете позже.

Предполагая, что все ваши годы четыре цифры, вы сможете их сортировать в порядке. Его только тогда, когда у вас есть различное количество цифр, которые вы получаете проблемы со строками сортировки строк (например, 1, 10, 2, 3). Причина в том, что если ваши номера имеют одинаковое количество цифр, тогда каждый сопоставляемый символ будет иметь один и тот же порядок величины (например, тысячи всегда будут сравниваться с тысячами).

+0

Вау! :) Большое спасибо. Работает. Теперь мне нужно подойти поближе и «переварить» все ваши ответы. – Geon

+0

Не забудьте подтвердить ответы, которые были вам полезны (и принять окончательный ответ, который, по вашему мнению, наилучшим образом отвечает на ваш вопрос). – Chris

+0

Хорошо. Большое спасибо. Извините, но я здесь новый, и я не так хорошо двигаюсь на данный момент. – Geon

0

Вы можете попробовать использовать метод Select() и преобразовать год (строку) в int. Что-то вроде этого:

var years = db.tbl1.Select(w => w.Year).Distinct().ToList().Select(x => int.Parse(x)); 

Он будет выполнять запрос на базу данных, получить столбец dinstinc и год, после этого, он будет конвертировать в памяти (LINQ к объектам) в IList<int>. После этого, years будет IList<int>, и вы можете использовать Sort() и другой метод для этого типа (или расширение):

years = years.Sort(); 

Вы также можете использовать метод OrderBy() заказать его и получить новый список, для образца:

years = years.OrderBy(y => y).ToList(); 

// or order descending 
years = years.OrderByDescending(y => y).ToList(); 
+0

Благодарим вас за ответ. Извините, но у меня ошибка компилятора: невозможно преобразовать строку типа в int. – Geon

+0

Я ожидаю, что вы получите сообщение о литье для w.Year, говорящее, что между строкой и int нет никакого неявного преобразования (поскольку w.Year - это строка). – Chris

+0

Вы попробовали? работает, как вам нужно? –

0

При использовании LINQ в отношении базы данных вы довольно ограничены тем, что можете сделать. Но если вы конвертируете в Entities, вы можете получить гораздо больше энергии!

var years = db.tbl1 
    .Select(y => y.Years) 
    .Distinct() 
    .ToList() // Forces the SQL query to execute and return your string list 
    .Select(y => int.Parse(y.Years)) 
    .OrderByDescending(y => y); 

Это должно выполнить ваш SQL, разбор строки в целые числа (кажется, что вы хотели это из вашего примера кода, если нет, то ToList и второй Select излишни) и вернуть нисходящий упорядоченный список лет целочисленных тип.

В основном запросы к SQL обычно не могут выполнять более мощные проверки, конверсии и т. Д. Кроме того, оператор Select фактически используется в качестве проекции для оптимизации SQL-запроса для выбора по желаемым полям. Если вам нужно скрыть набор результатов в бизнес-объект, вы должны сначала вызвать ToList() (или ToArray()), чтобы получить запрос для выполнения и возврата результатов. Все после этого момента LinqToEntities является гораздо более гибким. В этот момент вы можете конвертировать объекты, создавать новые и т. Д.

+2

Вы не хотите, чтобы второй выбор там, я бы подумал, так как y в вашей лямбда уже будет 'y.Years'. Также, как упоминалось в комментарии в другом месте, сортировка строк будет прекрасной, если все годы четыре цифры, поэтому нет необходимости конвертировать в int только для сортировки. – Chris

+0

Глядя на исходное сообщение, я не был уверен. Год был числовым. Если это так, правильно, вам не нужен .ToList(). Выберите (...) - он будет лишним. Затем OrderByDescending будет добавлен в сам SQL-запрос. –

+0

Первая строка: «У меня есть база данных со столбцом: Год (nvarchar)», поэтому я предполагаю, что Year - это строка, если не происходит что-то странное. :) – Chris