Linq порядок по дням даты в C # - PullRequest
1 голос
/ 22 марта 2012

У меня есть веб-приложение, которое отображает дни рождения сотрудников за текущий месяц в GridView.

Дни рождения хранятся в БД SQL Server 2008, они хранятся как полная дата-время, то есть ГГГГ-ММ-ДД ЧЧ: ММ: СС.000.

Запрос выполняется в виде.Я хочу отсортировать их по дате месяца. Пример:

John Smith Mar 1
Sally Smith Mar 5
Benny Smith Mar 16

Проблема в том, что оператор linq сортирует их по году рождения и затем по дате.Так что, если Салли родилась в 1962 году, а Джон и Бенни родились в 1988 году, то GridView будет отображаться так:

Sally Smith Mat 5
John Smith Mar 1
Benny Smith Mar 16

После копания я попытался сделать это так, что, как говорит другой вопрос, сработает.

List<BirthdayCurrentMonthView> record =
                (from tab in db.BirthdayCurrentMonthViews
                 orderby tab.Birthday ascending
                  select tab).ToList();


                string customFormat = "MMM d";

                var ud = record.Select(d => new
                {
                    d.FirstLast,
                    Formattedate = d.Birthday.ToString(customFormat)
                })
                .Distinct()
                .OrderByDescending(d => d.FormattedDate);
                this.grdBirthdays.DataSource = record;
                this.grdBirthdays.DataBind();

Проблема в том, что я получаю сообщение об ошибке: «Нет перегрузки для метода« ToString », требуется 1 аргумент»

Примеры, которые я видел, делают это таким образом, поэтому я 'м в недоумении, почему он не примет это.

Если бы вы могли мне помочь, это было бы здорово.Я хочу, чтобы строки в GridView были только по дням.Благодарю.

BirthdayCurrentMonthView:

SELECT EmployeeID, ActiveDirectoryName, FirstName, LastName, FirstName + ' ' + LastName   AS FirstLast, Birthday, Anniversary, IsActive
FROM         dbo.Employee
WHERE     (DATEPART(month, Birthday) = DATEPART(month, GETDATE()))

EmployeeID (int, not null)
ActiveDirectoryName (varchar(100), null)
FirstName (varchar(50), not null)
LastName (varchar(100), not null)
FirstLast (varchar(151), not null)
Birthday (datetime, null)
Anniversary (datetime, null)
IsActive (bit, null)

Определение дня рождения в C #:

public Nullable<global::System.DateTime> Birthday
    {
        get
        {
            return _Birthday;
        }
        set
        {
            OnBirthdayChanging(value);
            ReportPropertyChanging("Birthday");
            _Birthday = StructuralObject.SetValidValue(value);
            ReportPropertyChanged("Birthday");
            OnBirthdayChanged();
        }
    }

ОБНОВЛЕНИЕ:

Решение:

List<BirthdayCurrentMonthView> record =
                (from tab in db.BirthdayCurrentMonthViews
                 orderby ((DateTime)tab.Birthday).Day ascending
                  select tab).ToList();

СПАСИБО ВСЕМ !!!

Ответы [ 3 ]

2 голосов
/ 22 марта 2012

Похоже, Birthday не распознается как DateTime.Что произойдет, если вы сделаете это:

((DateTime)d.Birthday).ToString(customFormat)

Это должно заставить День Рождения быть датой Времени.Имейте в виду, что если это недопустимый DateTime, он выдаст ошибку.

Однако сначала вы должны выполнить оператор OrderBy, а затем выполнить форматирование.Заказ строки будет заказываться по ABC, а не по дате.

1 голос
/ 22 марта 2012

Что с этим не так?

List<BirthdayCurrentMonthView> record =
                (from tab in db.BirthdayCurrentMonthViews
                 orderby tab.Birthday.Day ascending
                  select tab).ToList();

DateTime.Date - это то, что вы просили. Очевидно, я все еще предполагаю, что ваш контекст данных отображает День рождения как DateTime

0 голосов
/ 22 марта 2012

Обновление, ошибка может быть из-за Nullable?У Nullable нет метода ToString (arg) - сначала получите значение.

Если бы у меня был список DateTime?, я бы просто сложил порядок и использовал HasValue

  var bdates = new List<Tuple<string, DateTime?>>();
  bdates.Add(Tuple.Create("Sally", (DateTime?)new DateTime(1962, 1, 1)));
  bdates.Add(Tuple.Create("John", (DateTime?)new DateTime(1988, 2, 1)));
  bdates.Add(Tuple.Create("Benny", (DateTime?)new DateTime(1988, 1, 1)));
  bdates.Add(Tuple.Create("Joe", (DateTime?)new DateTime(1988, 1, 2)));
  bdates.Add(Tuple.Create("Bob", (DateTime?)null));

  var v = bdates
    .Where(bdate => bdate.Item2.HasValue)
    .OrderBy(bdate => bdate.Item2.Value.Day)
    .OrderBy(bdate => bdate.Item2.Value.Month);
...