#c# #asp.net-core #kendo-ui
Вопрос:
Я использую кендуи в своем веб-приложении. Одна из таблиц нашей базы данных содержит массив значений, хранящихся в одном столбце в виде varchar
. У каждого есть свое мнение на этот счет, но в данный момент я должен с этим работать.
SQL Server
Office_Ids 1,2,3,4,5
Мне было поручено объединить названия офисов с этими идентификаторами, а также сделать эти идентификаторы более приятными(стилизованными) в сетке. Проблема в том, что, как строка, они неизменяемы, и поэтому все это начинает становиться очень сложным.
Желаемым результатом было бы следующее:
"lt;OfficeIdgt;1lt;/OfficeIdgt;lt;OfficeNamegt;Some Namelt;/OfficeNamegt;lt;OfficeIdgt;2lt;/OfficeIdgt;lt;OfficeNamegt;Some Namelt;/OfficeNamegt;"
Приведенный выше результат также предполагает, что я присоединяю данные к таблице office. Обычно я выполнял бы что-то подобное выше, используя регулярное выражение, если бы данные хранились в отдельных таблицах. Тот факт, что это не так, и является причиной путаницы.
Вот мой контроллер, это всего лишь тестовое действие контроллера на данный момент, когда я пытался разобраться в этом. Вы увидите, что я кое-что здесь делаю:
- Позвоните в мой репозиторий, чтобы получить данные
- Создайте два списка, один для офисов, а другой
test
для попыток добавить вышеупомянутые элементы кода в строки. - Я разделяю массив идентификаторов офиса из
Office_Ids
столбца и возвращаюсь к списку - Затем я повторяю этот список и пытаюсь использовать строковые вставки для вставки этих тегов
общедоступное IQueryable чтение() { IQueryable данные = _компания.GetAll();
Listlt;stringgt; office_item = new Listlt;stringgt;(); Listlt;stringgt; test = new Listlt;stringgt;(); foreach (var item in data) { office_item = item.Office_Ids .Split(',') .Select(x =gt; x.Trim('"')) .Select(x =gt; x.Trim(' ')).ToList(); foreach (var office in office_item ) { client.Insert(0, "lt;OfficeIdgt;"); client.Insert(2, "lt;/OfficeIdgt;"); test.Add(client); } } Console.WriteLine(test); return data; }
Проблемы
- На самом деле это работает не очень хорошо
- Я никогда не узнаю, какой длины идентификатор офиса, и поэтому, если они когда-либо будут иметь длину 4 номера, этот подход к вставке не сработает.
- Мне нужно вернуть эти значения в мою сетку как часть модели, чего она в данный момент не делает, и, наконец,
- Мне все еще нужно подключить офисный стол к этим идентификаторам.
Модель для CompanyReview
выглядит следующим образом:
namespace MyCompany.Data { public class OfficeReview : BaseEntity { public string Office_Ids { get; set; } } }
Я думаю, что я рассмотрел здесь все, но суть в том, что мне нужно отделить строку, представляющую собой массив значений, добавить к ней несколько открывающих и закрывающих тегов, а затем вернуть ее как часть моей модели в сетку. После этого я использую какое-нибудь регулярное выражение, чтобы оно выглядело красиво.
Комментарии:
1. Возможно, вы захотите рассмотреть возможность сериализации этого с помощью XML-сериализатора, который, я думаю, достигнет вашего результата.
Ответ №1:
Подумайте об использовании XElement
. Он очень хорошо подходит для построения XML и обработки с использованием запросов Linq.
var officeItems = new Listlt;stringgt; { "1, 2, 42, 12313", "2, 5, 234", "1" }; var officeIdElements = officeItems .SelectMany(s =gt; s.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)) .Select(id =gt; new XElement("OfficeId", id)); //The output you requested string officeIds = string.Concat(officeIdElements.Select(idElement =gt; idElement.ToString()));
Однако, если вы хотите расширить это, чтобы включить , скажем, другие элементы OfficeName
, то вы могли бы сделать
var officeElements = officeIdElements.Select(idElement =gt; { var officeName = $"Office { idElement.Name }"; var officeNameElement = new XElement("OfficeName", officeName); return new XElement("Office", idElement, officeNameElement); });
и если вам нужно завернуть его под родительский узел для хорошо сформированного XML
var officesElement = new XElement("Offices", officeElements); /* lt;Officesgt; lt;Officegt; lt;OfficeIdgt;1lt;/OfficeIdgt; lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt; lt;/Officegt; lt;Officegt; lt;OfficeIdgt;2lt;/OfficeIdgt; lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt; lt;/Officegt; lt;Officegt; lt;OfficeIdgt;42lt;/OfficeIdgt; lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt; lt;/Officegt; lt;Officegt; lt;OfficeIdgt;12313lt;/OfficeIdgt; lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt; lt;/Officegt; lt;Officegt; lt;OfficeIdgt;2lt;/OfficeIdgt; lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt; lt;/Officegt; lt;Officegt; lt;OfficeIdgt;5lt;/OfficeIdgt; lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt; lt;/Officegt; lt;Officegt; lt;OfficeIdgt;234lt;/OfficeIdgt; lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt; lt;/Officegt; lt;Officegt; lt;OfficeIdgt;1lt;/OfficeIdgt; lt;OfficeNamegt;Office OfficeIdlt;/OfficeNamegt; lt;/Officegt; lt;/Officesgt; */
Ответ №2:
Если вам нужно вывести строку, может сработать следующий подход:
var officeItems = new Listlt;stringgt; { "1, 2, 42, 12313", "2, 5, 234", "1" }; var officeResults = new Listlt;stringgt;(); foreach (var officeItem in officeItems) { foreach (var item in officeItem.Replace(" ", string.Empty).Split(",")) { var officeName = service.GetOfficeName(item); officeResults.Add($"lt;OfficeIdgt;{item}lt;/OfficeIdgt;lt;OfficeNamegt;{officeName}lt;/OfficeNamegt;"); } }