Выполнение LINQ-запросов к объекту DataTable - PullRequest
0 голосов
/ 22 декабря 2010

Скажем, у меня есть объект DataTable с данными из базы данных, и мне нужно реорганизовать его.Я думаю (согласно моим исследованиям) LINQ был бы элегантным (но быстрым ли?) Способом сделать это.Вопрос в том, как.

Данные поступают из базы данных в следующем формате

ORDER  SAMPLE  METHOD    

1234   1      ASH-10        
1234   1      ASH-11   
1234   1      ASH-12   
1234   2      ASH-10    
1234   2      ASh-12
1234   5      ASH-10
1235   1      BSH-10
1235   1      BSH-11
1235   1      BSH-12

Мне нужно, чтобы они были перетасованы как

ORDER  SAMPLE ASH-10 ASH-11 ASH-12 BSH-10 BSH-11 BSH-12 
1234    1      Y       Y      Y     N        N    N
1234    2      Y       N      Y     N        N    N
1234    5      Y       N      N     N        N    N
1235    1      N       N      N     N        Y    Y

Как вы можете видетьстолбцы метода будут динамическими.Конечно, я мог бы перебирать данные, используя старомодный цикл, но кажется, что LINQ был бы лучшим и более быстрым способом сделать это.Поправь меня, если я ошибаюсь.

Ответы [ 3 ]

2 голосов
/ 22 декабря 2010

DataTable отлично подходит для извлечения данных из базы данных в ваше приложение, но как только у вас есть данные, вам обычно лучше преобразовать их в пользовательские объекты.*

 class AllOrders
 {
    public static List<Order> Orders = new List<Order>();
    public static List<Method> Methods = new List<Method>();

    public static void ProcessTable(DataTable dt)
    {
        foreach (DataRow dr in dt.Rows)
        {
            int sampleId = Convert.ToInt32(dr["SAMPLE"]);
            string methodName = Convert.ToString(dr["Method"]);
            AddOrder(sampleId, methodName);
        }
    }

    private static void AddOrder(int SampleId, string methodName)
    {
        Method m = Methods.FirstOrDefault(x => x.Name == methodName);
        if (m == null)
        {
            m = new Method(methodName);
            Methods.Add(m);
        }
        Order o = new Order(SampleId, m);
        Orders.Add(o);
    }
}

class Order
{
    public Order(int sampleId, Method m)
    {
        this.Method = m;
        this.SampleId = sampleId;
    }
    public int SampleId; //a more mature design might have a Sample class instead.
    public Method Method;

}

class Method
{
    public string Name;
    public Method(string name)
    {
        this.Name = name;
    }
}
1 голос
/ 22 декабря 2010

В итоге я использовал цикл для итерации и сортировки данных. Подход к заполнению объектов здесь был немного излишним - это веб-сервис, поэтому все, что мне было нужно, это отсортировать данные и вернуть их. Поэтому я сохранил это просто.

0 голосов
/ 22 декабря 2010

В таких случаях лучше использовать Динамическое вращение (SQL SERVER 2005).

Oracle 11g поддерживает Поворот .Для более низкой версии вы можете взглянуть на this или this , или даже поиск в Google даст много примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...