我有一个认证流程。现在它会将人员添加到我的认证表中,即使他们已经获得相关项目的认证。
在我的视图页面上,我有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)
VerifiedDate DATETIME
adUserName NVARCHAR
如果它们存在,我应该能够从adUserName和procedureID中获取行并获取唯一的单个记录。如果它们确实存在,那么我需要做的就是将VerifiedDate更新为今天的日期。如果找不到记录,那么我需要执行上面的添加。
上面的代码有错误:
IPACS_Certification doesExist = db.IPACS_Certification.Where(m => m.adUserName == item && m.procedureID == procedureID).Select(m => m);
无法将System.Linq.IQueryable类型隐式转换为IPACS_Certification。我知道我在那里遗失了一些东西。
答案 0 :(得分:2)
您只需选择一条记录:
IPACS_Certification doesExist = db.IPACS_Certification.Where(m => m.adUserName == item && m.procedureID == procedureID).Select(m => m).FirstOrDefault();
答案 1 :(得分: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
}
答案 2 :(得分:1)
您需要使用FirstOrDefault或SingleOrDefault之类的东西来运行查询并返回单个对象。
IPACS_Certification doesExist = db.IPACS_Certification.Where(m => m.adUserName == item && m.procedureID == procedureID).Select(m => m).FirstOrDefault();
答案 3 :(得分: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
}