#c# #asp.net #regex #linq #asprepeater
#c# #asp.net #регулярное выражение #linq #asprepeater
Вопрос:
У меня есть две таблицы «Категория» и «Фильм» с 1-М отношением (‘CategoryID’ — это внешний ключ в таблице «Фильм»). Я использую ListView для перечисления всех категорий. Внутри моего ListView есть повторитель, который перебирает все фильмы в каждой категории.
В моем исходном коде я привязываю источник данных ListView следующим образом:
MovieDBDataContext context = new MovieDBDataContext();
var categories = context.Categories.Select(x => x).OrderBy(x => x.Order).ToList();
ListView1.DataSource = categories;
ListView1.DataBind();
и я привязываю источник данных повторителя в разметке следующим образом:
<asp:Repeater runat="server" ID="repeater" DataSource='<%# ((Category)Container.DataItem).CategoryItems.Where(p => p.Active == true).OrderBy(p => p.Name) %>'>
Теперь у меня возникает требование, при котором мне нужно отсортировать мой фильм по названию, но если фильм начинается с «The», то мне нужно проигнорировать это и отсортировать по оставшейся части названия (таким образом, «Властелин колец» будет отсортирован как «Властелин колец»).
Есть ли способ изменить мой оператор Linq, чтобы таким образом манипулировать строками на лету?
Комментарии:
1. Есть ли у вас какой-либо контроль над источником данных, чтобы, возможно, возвращать эти данные как «Властелин колец»?
2. И как бы вы отсортировали » Новую надежду»?
3. @ewitkows да, у меня есть контроль над источником данных, но я не уверен, как я смогу этого добиться..
4. @rsenna лол, хороший вопрос, я об этом не думал .. такой сценарий еще не придуман, но я бы предположил, что справился бы с этим, используя тот же подход
Ответ №1:
((Category)Container.DataItem).CategoryItems.Where(p => p.Active == true).OrderBy(p => p.Name.StartsWith("The ") ? p.Name.Substring(4): p.Name)
Комментарии:
1. идеально! Спасибо за помощь!
Ответ №2:
Вы можете создать класс Categories, в котором у вас могут быть нужные вам атрибуты.
public class Categories {
public string Movies { get; set; }
public string Category { get; set; }
}
Я не знаю точно, что вы получаете из своей базы данных, но для каждого элемента вы можете создать атрибут n, который позволит вам получать данные из базы данных и сохранять их как type object.
Когда вы фактически вводите данные, вы можете использовать следующий код
List<Categories> categories = .Select(x => new Categories {
Movies = (x.Movies.substring(0, 3).ToLower().Equals("the")) ?
x.Movies.substring(3) ", " x.Movies.substring(0, 3) :
x.Movies, Category = x.Category).OrderBy(x => x.Order).ToList();
Теперь имеющиеся у вас данные должны быть правильно отформатированы, чтобы делать то, что вы пытались сделать, как и раньше.