получить последнюю запись таблицы в базе данных?

#c# #linq #visual-studio-2008

#c# #linq #visual-studio-2008

Вопрос:

я разрабатываю проект, и после того, как пользователь вставит данные клиента, он предполагает напечатать идентификатор и имя клиента, это код идентификатора

 int getPatnID()
    {
        int ID = (from i in Db.Patients
                  select i.patn_ID).Max();
        return ID;
    }
  

я написал код для получения имени, но не могу его закончить

 string getPatnName()
    {
        string name = (from n in Db.Patients
                       select n.patn_name).

        return name;
    }
  

Как я должен написать, чтобы завершить это??

Комментарии:

1. Просто предупреждение … если есть несколько клиентов, работающих с базой данных, захват последней записи после вставки опасен.

Ответ №1:

Это всегда должно приводить к получению последней вставленной записи во время выполнения (при условии, что patn_id автоматически увеличивается)

 string GetPatnName() 
{
    string name = (from n in Db.Patients 
                   orderby n.patn_ID descending 
                   select n.patn_name).FirstOrDefault();
    return name;
}
  

Ответ №2:

Измените getPatnName , чтобы использовать идентификатор:

 string getPatnName(int id)
{
    string name = (from n in Db.Patients
                   where n.patn_ID == id
                   select n.patn_name).SingleOrDefault();

    return name;
}
  

и выдать ей результат getPatnID()

Комментарии:

1. Я никогда не видел, где после выбора. Будет ли это работать в Linq?

2. после select есть where, а также есть join 🙂 , мощная библиотека 😉

Ответ №3:

Если вы пытаетесь получить имя последнего пациента, которого вы только что ввели, и у вас есть идентификатор из первого запроса, вам просто нужно предложение where в вашем LINQ.

 string name = (from n in Db.Patients
       where n.patn_ID == ID
       select n.patn_name);
  

Комментарии:

1. остерегайтесь моего комментария в вашем вопросе. Получение идентификатора путем чтения последней записи допустимо, если у вас есть только один клиент, работающий с базой данных. В противном случае вам нужно будет переосмыслить логику.

Ответ №4:

 string getPatnName() {
    string name = Db.Patients.Last(p => p.patn_ID).patn_name;
    return name;
}
  

Я предлагаю вам потратить еще немного времени на изучение LINQ — это очень богатая и мощная библиотека: http://msdn.microsoft.com/en-us/library/bb397926.aspx

Комментарии:

1. Оператор запроса ‘Last’ не поддерживается. я получил эту ошибку, когда я использую это

2. Извините за эту ошибку, я не понял, что используемый вами OR / M не поддерживает оператор Last. Попробуйте это с обновленным кодом. В основном, что он делает, это выбирает последний элемент, который соответствует указанному вами предикату — в данном случае идентификатору каждой отдельной записи пациента.

3. я пытался использовать last раньше, но это не работает, но спасибо за совет, и да, я думаю, что это очень мощная библиотека

Ответ №5:

Получать идентификатор так, как вы делаете, неправильно. Не уверен, что вы используете, но и linq-2-sql, и entity framework заполняют идентификатор объекта при сохранении изменений:

     Patient patient = new Patient();
    Console.WriteLine(patient.Id); // will NOT be filled in
    Db.Patients.Add(patient);
    Db.SubmitChanges(); // SaveChanges in EF
    Console.WriteLine(patient.Id); // will be filled in
  

Комментарии:

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

2. Это случайно. Как уже упоминалось @ncydan, в многопользовательском сценарии это гарантированно завершится неудачей.

Ответ №6:

Почему бы просто не создать класс patient и не вернуть экземпляр, как показано ниже

 public class Patient
{
    public int PatientID { get; set; }
    public string Name { get; set; }
}


static Patient getDetails()
    {
        using (DataClasses1DataContext db = new DataClasses1DataContext())
        {
            var c = (from x in db.Patients.OrderByDescending(u => u.PatientID)
                     select new Patient()
                     {
                         PatientID = x.PatientID,
                         Name = x.Name
                     }).FirstOrDefault();
            return c;
        }
  

Комментарии:

1. не слишком ли долго получать идентификатор и имя для 1 использования??

2. извините, вы правы, я неправильно прочитал вопрос и просто подумал, что все, что требовалось, — это средство получения последнего значения из таблицы