#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. извините, вы правы, я неправильно прочитал вопрос и просто подумал, что все, что требовалось, — это средство получения последнего значения из таблицы