Удалить подстроку в ASP.NET разметка с использованием LINQ

#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();
  

Теперь имеющиеся у вас данные должны быть правильно отформатированы, чтобы делать то, что вы пытались сделать, как и раньше.