2013-07-25 48 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()

編輯:

或者你可以使用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(); 
相關問題