Я работаю над веб-API на С# и получаю данные из базы данных SQL. Когда я помещаю один номер студента в вызов GET, их данные возвращаются правильно, однако, если у них есть две строки в запросе SQL, то Return в вызове GET показывает их данные в двух отдельных свойствах. Есть ли способ объединить объекты списка для пользователя, у которого есть две разные строки данных, в один возврат. Например, приведенный ниже пользователь принадлежит к двум отделам (политика и религия), и когда я вызываю метод GET, они появляются дважды, по одному разу для каждого отдела;
{
"roles": [
[
"STUDENT",
"UG",
2,
"Politics",
"Smith, John",
123456
],
[
"STUDENT",
"UG",
2,
"Religions",
"Smith, John",
123456
]
]
}
Вот что я хотел бы вернуть;
{
"roles": [
[
"STUDENT",
"UG",
2,
"Politics",
"Religions",
"Smith, John",
123456
]
]
}
Я извлекаю данные из базы данных SQL Server с помощью запроса и создал список, в который я добавляю данные из запроса в виде объектов. Когда я ищу студента, используя его идентификатор, и если у него два разных отдела, я бы хотел, чтобы два свойства возвращались как одно.
Я попытался сделать следующее, но это все, что у меня получилось;
int howmanyrecords = studentList.Count;
if (howmanyrecords >1)
{
foreach(Object stu in studentList)
{
var firstObject = studentList.ElementAt(0);
}
}
Вышеупомянутый studentList.ElementAt(0) извлекает первый экземпляр в studentList, т. е. запись, в которой «Политика» является отделом, но я не уверен, как завершить вышеизложенное и как объединиться в один объект — моя первоначальная мысль заключалась в том, чтобы сравните все индексы обоих объектов и, если они разные, добавьте значение в индексе X из объекта2 в объект1.
Любые указатели будут оценены.
Этот код вы хотите
var jObj = JObject.Parse(json);
var roles = (JArray)jObj["roles"];
if (roles.Count() > 1)
{
jObj["roles"] = new JArray(roles[0].Union(roles[1]));
json = jObj.ToString();
}
ИМХО этот код вам нужен
if (roles.Count() > 1)
{
for (int i = 0; i < roles[0].Count(); i++)
{
if (roles[0][i].ToString() != roles[1][i].ToString())
{
var arr = new JArray();
arr.Add(roles[0][i]);
arr.Add(roles[1][i]);
roles[0][i] = arr;
}
}
roles[1].Remove();
json = jObj.ToString();
}
Выход
{
"roles": [
[
"STUDENT",
"UG",
2,
[
"Politics",
"Religions"
],
"Smith, John",
123456
]
]
ОБНОВЛЯТЬ
Это будет работать для любого количества студентов
var jObj = JObject.Parse(json);
var roles = (JArray)jObj["roles"];
if (roles.Count() > 1)
{
for (int j = 0; j < roles[0].Count(); j++)
{
var jArr = new JArray();
for (var i = 1; i < roles.Count(); i++)
{
if (i == 1) jArr = new JArray { roles[0][j] };
jArr.Add(roles[i][j]);
}
var arr = jArr.Distinct();
if (arr.Count() > 1) roles[0][j] = new JArray(arr); // ["Politics", "Religions"]
//or if you dont want an array
if (arr.Count() > 1) roles[0][j] = string.Join(",", arr); // "Politics,Religions"
}
var c = roles.Count();
for (var i = c - 1; i > 0; i--)
roles[i].Remove();
json = jObj.ToString().Dump();
}
@GBM У меня есть 2 решения. Какое решение работает для вас?
К сожалению, извиняюсь - второе решение - это то, с которым я пошел, и оно работает для меня - спасибо :). Позвольте мне опробовать ваше отредактированное решение для любого количества учащихся. Спасибо, что нашли время помочь Сергею. Ценить это!
@GBM Теперь вам понадобится решение для десериализации его в ваш класс Student. Разместите вопрос, включая студенческий класс, и я отвечу
Привет Серж, как и просили, вопрос теперь размещен здесь - stackoverflow.com/questions/75499269/…
@GBM Сначала вы должны принять этот ответ. Я снова ответил на ваш новый вопрос, так как он не имеет для меня никакого смысла, сначала вы сказали мне, что выбрали второе решение. Вам действительно нужно решить, чего вы хотите, и думать на один шаг вперед. Что вы собираетесь делать после того, как сбросили несколько записей в одну большую кучу мусора? Откуда вы знаете, религиозное ли это, или это отдел или имя?
Религии - это название отдела. В исходном SQL-запросе учащийся извлекается из базы данных с тремя отделами, поскольку он участвует в совместной программе, поэтому он извлекается с тремя отделами. Надеюсь, это имеет больше смысла в новом вопросе, который я опубликовал. Я закрою этот.
@GBM Извините, но это не имеет никакого смысла, иначе вам придется оставить имена свойств, а не только значения, как сейчас, или для того, чтобы определить имя свойства позже, значения должны быть помещены в специальный заказ. При этом, если запись имеет несколько одинаковых свойств, их следует вынести в скобки.
К сожалению, внешняя компания, которая будет извлекать данные из нашего API, очень конкретно указала, как они хотят представлять данные, и мы пытались заставить их понять сложности, связанные с их запросом, но безуспешно. Но не волнуйтесь - я постараюсь разобраться. Большое спасибо за вашу помощь в этом сложном вопросе. Очень признателен.
@GBM Я обновил свой ответ, если вы не хотите, чтобы массив использовал его, если (arr.Count() > 1) roles[0][j] = string.Join(",", arr);
Бинго! Сделано именно то, что я хотел. Вы, сэр, гений! Большое спасибо - я использовал ваш ответ из вашего последнего «ОБНОВЛЕНИЯ» выше! Спасибо Серж :)
Серж, спасибо, что второй раз за эту неделю пришёл на помощь, ха-ха! Вы становитесь чем-то вроде спасителя! Я попробовал ваше решение, и оно работает, как вы советовали, так что спасибо. Единственный вопрос, который у меня есть, заключается в том, что если у студента более 2 факультетов, скажем, 3 или более, то как лучше всего, по вашему мнению, мне следует реализовать это, поскольку текущее решение работает в предположении, что когда-либо будет только 2 отдела ... что полностью по моей вине, так как я должен был быть более ясным в своем вопросе.