2013-07-25 4 views
0

У меня есть процесс сертификации. Сейчас он добавит людей в мою таблицу сертификации, даже если они уже сертифицированы для данного товара.Проверьте, существует ли строка перед ее добавлением?

На моей странице просмотра у меня есть procedureID и есть имя пользователя Active Directory. Я передаю это моему методу контроллера, который затем добавляет их в таблицу.

Однако, если они уже существуют, им не нужно добавлять их, просто обновляя дату сертификации и оставляя все остальное в покое.

У меня возникли проблемы с проверкой, существуют ли они.

[HttpPost] 
public ActionResult AddCertification(int procedureID, FormCollection collection) 
{ 
    string[] certifiedUsers = collection["members"].Split(','); 

    IPACS_Certification ipacs_certification = new IPACS_Certification(); 

    foreach (var item in certifiedUsers) 
    { 
     // Does the certification exist? 
     IPACS_Certification doesExist = db.IPACS_Certification.Where(m => m.adUserName == item && m.procedureID == procedureID).Select(m => m); 
     ipacs_certification.procedureID = procedureID; 
     ipacs_certification.certifiedDate = DateTime.Now; 
     ipacs_certification.adUserName = item; 

     db.IPACS_Certification.Add(ipacs_certification); 
     db.SaveChanges(); 
    } 

    return RedirectToAction("AddCertification"); 
} 

В моей таблице содержатся следующие столбцы.

certID (ключ IDENTITY)
procedureID (FKEY Процедуре таблицу)
certifiedDate DATETIME
adUserName NVARCHAR

Если они существуют, я должен быть в состоянии захватить строку из adUserName и procedureID и захватить уникальная одиночная запись. Если они существуют, все, что мне нужно сделать, это обновить certifiedDate до сегодняшней даты. Если запись не найдена, мне необходимо выполнить добавление выше.

Приведенный выше код содержит ошибку:

IPACS_Certification doesExist = db.IPACS_Certification.Where(m => m.adUserName == item && m.procedureID == procedureID).Select(m => m); 

Не может неявно преобразовать тип System.Linq.IQueryable в IPACS_Certification. Я знаю, что там что-то не хватает.

+0

какая ошибка вы получаете? –

+0

Каков тип переменной «item», на которую вы ссылаетесь? –

+0

@ LukeW. только ошибка, которую я получаю в настоящее время, находится в нижней части исходного сообщения. Главный вопрос: я не уверен, как проверить, существует ли запись без использования поля ID. На этом месте есть только adUsername и procedureID. –

ответ

1

может проверить, если запись существует следующий способ:

bool exists = db.IPACS_Certification.FirstOrDefault(m => m.adUserName == item && m.procedureID == procedureID) != null; 

, если он действительно существует, и вы хотите использовать данные из этой строки, а сделать это таким образом:

IPACS_Certification certification= db.IPACS_Certification.FirstOrDefault(m => m.adUserName == item && m.procedureID == procedureID); 

if(certification != null) { 
    // exists, do stuff with data from object 
} 
else { 
    //doesn't exist, save the certification 
} 
+0

Я собираюсь пойти с этим, потому что он предоставляет больше информации и подходит именно вам. Хотя все ответы верны, и я ценю их всех. :) –

+0

Для целей самостоятельной документации я бы использовал 'bool exists = db.IPACS_Certification.Any (...);' вместо этого. –

+0

Да или даже db.IPACS_Certification.Where (m => m.adUserName == item && m.procedureID == procedureID) .Any(); –

2

Вам нужно выбрать только одну запись:

IPACS_Certification doesExist = db.IPACS_Certification.Where(m => m.adUserName == item && m.procedureID == procedureID).Select(m => m).FirstOrDefault(); 
2

У вас есть .Select(m => m) что бы возвращать IEnumerable<T>, вам нужно First или FirstOrDefault

Таким образом, ваш запрос может быть:

IPACS_Certification doesExist = 
    db.IPACS_Certification.FirstOrDefault(m => m.adUserName == item && m.procedureID == procedureID); 

Или в вашем текущем запросе просто добавьте FirstOrDefault() в конец.

EDIT:

Или вы можете использовать Enumerable.Any с текущим запросом, как:

IPACS_Certification doesExist = db.IPACS_Certification 
            .Where(m => m.adUserName == item && m.procedureID == procedureID) 
            .Select(m => m); 
if(doesExist.Any()) 
{ 
    //record exists 
} 
else 
{ 
    // doesn't exist 
} 
1

Вы должны использовать что-то вроде FirstOrDefault или SingleOrDefault запустить запрос и получить обратно один объект.

IPACS_Certification doesExist = db.IPACS_Certification.Where(m => m.adUserName == item && m.procedureID == procedureID).Select(m => m).FirstOrDefault(); 
Смежные вопросы