2013-07-25 46 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(); 
相关问题