Сортировка и категоризация данных из базы данных
Мне нужен способ разбить на категории большие объемы (примерно 120 или более значений) данных, поступающих из базы данных. Ничего особенного не приходит в голову, поэтому я решил спросить здесь. Мне нужен C#
или же SQL
решение (или хотя бы советы по нему).
Данные, которые должны быть отсортированы в настоящее время, находятся в одном столбце, но я открыт для любых предложений. Пример данных ниже:
- A2-11 (Main branch that contains all A2 from below)
- A2-113
- A2-114
- A2-115
- .
- .
- .
- F-L-5 (Main branch)
- F-L-55 (Another branch in there)
- F-L-56 (Contains all values below)
- F-L-566
- F-L-567
- .
- .
- .
Заранее спасибо!!
В качестве примера может быть отображена небольшая древовидная диаграмма:
TreeExample3 ответа
Попробуйте пользовательский OrderBy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication50
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("Category", typeof(string));
string[] data = { "Main-A2-11", "Main-A2-113", "Main-A2-114", "Main-A2-115",
"Third-F-L-56", "Third-F-L-566", "Third-F-L-567",
"Second-F-L-5", "Second-F-L-55"
};
foreach (string d in data)
{
dt.Rows.Add(new object[] { d });
}
dt = dt.AsEnumerable().GroupBy(x => x.Field<string>("Category").Contains("-") ?
x.Field<string>("Category").Substring(0,x.Field<string>("Category").IndexOf("-")) :
x.Field<string>("Category"))
.Select(x => x.OrderBy(y => new SortRecord(y,"Category"))).SelectMany(x => x).CopyToDataTable();
}
}
public class SortRecord : IComparer<SortRecord >, IComparable<SortRecord>
{
string[] rowSplitArray;
int length = 0;
public SortRecord(DataRow x, string name)
{
rowSplitArray = x.Field<string>(name).Split(new char[] { '-' });
length = rowSplitArray.Length;
}
public int Compare(SortRecord rowA, SortRecord rowB)
{
int len = Math.Min(rowA.length, rowB.length);
for (int i = 0; i < len; i++)
{
if (rowA.rowSplitArray[i] != rowB.rowSplitArray[i])
return rowA.rowSplitArray[i].CompareTo(rowB.rowSplitArray[i]);
}
return rowA.length.CompareTo(rowB.length);
}
public int CompareTo(SortRecord row)
{
return Compare(this, row);
}
}
}
Существует несколько способов достижения результата, но если вам необходимо определить производительность, следуйте этой статье. Какие есть варианты хранения иерархических данных в реляционной базе данных?
Вы, конечно, можете использовать ierarchyid в SQL. https://docs.microsoft.com/en-us/sql/relational-databases/hierarchical-data-sql-server
Это может помочь, я думаю.