Реализация Next / Previous с LINQ to SQL - PullRequest
0 голосов
/ 20 августа 2009

У меня есть приведенный ниже код в попытке разрешить пользователю «пройти через» примечания к делу в БД, нажимая кнопку «Далее» или «Предыдущая» в WinForm. Он будет захватывать только первую записку. Что я делаю не так?

В этот пост было внесено множество изменений, извиняюсь, но, следуя совету Джона Скита, я смог "исправить" то, что изначально было неправильно, но оно все равно не работает.

Нужно ли реструктурировать мой запрос, чтобы учесть текущую заметку? Если да, то как мне это сделать?

    public static Guid NextCaseNoteID (int personID)
    {
        var context = new MatrixDataContext();

        Guid nextNoteID = (from caseNote in context.tblCaseNotes
                                                   where caseNote.PersonID == personID
                                                   orderby caseNote.InsertDate
                                                   select caseNote.CaseNoteID ).Skip(1).FirstOrDefault();

        return nextNoteID;
    }


Это то, чем я закончил, спасибо всем, кто писал и следил за моей дурной мыслью ...

Кажется, это работает хорошо, хотя сейчас я пытаюсь доказать, что мне все еще нужен Skip (1) .... Спасибо !!

для дальнейшего использования

        public static Guid NextCaseNoteID (int personID, DateTime? insertDate)
    {
        var context = new MatrixDataContext();

        Guid nextNoteID = (from caseNote in context.tblCaseNotes
                                                   where caseNote.PersonID == personID && caseNote.InsertDate > insertDate
                                                   orderby caseNote.InsertDate
                                                   select caseNote.CaseNoteID ).Skip(1).FirstOrDefault();

        return nextNoteID;
    }

    public static Guid PreviousCaseNoteID(int personID, DateTime? insertDate)
    {
        var context = new MatrixDataContext();

        Guid nextNoteID = (from caseNote in context.tblCaseNotes
                           where caseNote.PersonID == personID && caseNote.InsertDate < insertDate
                           orderby caseNote.InsertDate
                           select caseNote.CaseNoteID).Skip(1).FirstOrDefault();

        return nextNoteID;
    }

Ответы [ 3 ]

2 голосов
/ 20 августа 2009

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

public static IQueryable<Guid> NextCaseNoteID (int personID)
{
    var context = new MatrixDataContext();

    IQueryable<Guid> nextNoteID = (from caseNote in context.tblCaseNotes
                                   where caseNote.PersonID == personID
                                   orderby caseNote.InsertDate
                                   select caseNote.CaseNoteID).Skip(1).Take(1);

    return nextNoteID;
}

Я совсем не уверен, что это действительно то, что вам нужно, но, скорее всего, оно по крайней мере скомпилируется ...

Вы уверены, что не хотите возвращать фактический GUID вместо IQueryable<Guid>?

Возможно, вы захотите позвонить FirstOrDefault() вместо Take(1) ...

РЕДАКТИРОВАТЬ: Хорошо, так что делает возвращает GUID ... вы говорите, что это не работает, но не как это не работает. Если вы хотите получить следующую заметку, вам, скорее всего, следует указать идентификатор заметки, а не человека, но это не совсем понятно ...

1 голос
/ 21 августа 2009

Если вам нужен следующий / предыдущий метод, разве вы не должны сообщать, какая сейчас позиция сейчас? А затем пропуская currentPosition + 1 для next и currentPosition - 1.

Я обычно использую Single () вместо FirstOrDefault (). Но я думаю, что это ничего не изменит.

0 голосов
/ 20 августа 2009

Я мог бы звучать как идиот. Но почему вы не можете использовать для этого средство чтения данных (особенно если вы используете linq to sql, который, в свою очередь, вызывает для этого SQL Server)?

Дайте мне знать, если я полностью неправильно понял проблему.

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