LINQ to SQL: Как реализовать наименьшую или аналогичную функцию? - PullRequest
0 голосов
/ 15 марта 2011

Дано:

Таблица с именем TABLE_1 со следующими столбцами:

  • ID
  • ColumnA
  • ColumnB
  • ColumnC
  • ColumnD

У меня есть SQL-запрос, в котором TABLE_1 включается сам по себе дважды на основе ColumnA, ColumnB, ColumnC.Запрос может выглядеть примерно так:

Select t1.ID, t2.ID, t3.ID, LEAST(t1.ColumnD, t2.ColumnD, t3.ColumnD)
  From TABLE_1 t1
  Left Join TABLE_1 t2 On
       t1.ColumnA = t2.ColumnA
   And t1.ColumnB = t2.ColumnB
   And t1.ColumnC = t2.ColumnC
  Left Join TABLE_1 t3 On
       t2.ColumnA = t3.ColumnA
   And t2.ColumnB = t3.ColumnB
   And t2.ColumnC = t3.ColumnC

Проблема:

Мне нужно переписать этот запрос в LINQ.Я попытался нанести удар:

var query =
    from t1 in myTABLE1List // List<TABLE_1>
    join t2 in myTABLE1List
      on new {t1.ColumnA, t1.ColumnB, t2.ColumnC}
  equals new {t2.ColumnA, t2.ColumnB, t2.ColumnC}
    join t3 in myTABLE1List
      on new {t2.ColumnA, t2.ColumnB, t2.ColumnC}
  equals new {t3.ColumnA, t3.ColumnB, t3.ColumnC}
  select new {
    ID_1 = s1.ID,
    ID_2 = s2.ID,
    ID_3 = s3.ID,
    // Invalid anonymous type member declarator.
    // Anonymous type members must be declared with a member assignment,
    // simple name or member access.
    // how can I implement this?
    least(s1.ColumnD, s2.ColumnD, s3.ColumnD)
  };

....

private object least(params object[] objects)
{
  // code here that sorts the objects and returns the 'smallest' of them.

  return leastObject;
}

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

Ответы [ 2 ]

1 голос
/ 15 марта 2011

Я могу ошибаться, но я думаю вам нужно присвоить результат least фактическому члену вашего нового экземпляра анонимного типа, например:

select new {
    ID_1 = s1.ID,
    ID_2 = s2.ID,
    ID_3 = s3.ID,
    Least = least(s1.ColumnD, s2.ColumnD, s3.ColumnD)
};
1 голос
/ 15 марта 2011

Как насчет?

MinOfColumnD = Math.Min(Math.Min(s1.ColumnD, s2.ColumnD), s3.ColumnD))

РЕДАКТИРОВАТЬ: Предполагая, что ColumnD в каждой из таблиц является числовым, и «наименьший» (в этом контексте) является минимум 3 числа в указанных столбцах.

РЕДАКТИРОВАТЬ: если столбцы строки, определить, что макс. значения, которые он может содержать и сделать .Parse на нем. Например,

MinOfColumnD = Math.Min(Math.Min(int.Parse(s1.ColumnD), int.Parse(s2.ColumnD)), int.Parse(s3.ColumnD)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...