0

我有一个认证过程。现在,即使他们已经获得了相关项目的认证,它也会将人员添加到我的认证表中。

在我的查看页面上,我有一个procedureIDActive 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 (key IDENTITY)
procedureID (fkey to Procedure table)
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。我知道我在那里遗漏了一些东西。

4

4 回答 4

2

您只需要选择一条记录:

IPACS_Certification doesExist = db.IPACS_Certification.Where(m => m.adUserName == item && m.procedureID == procedureID).Select(m => m).FirstOrDefault();
于 2013-07-25T17:27:57.667 回答
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
}
于 2013-07-25T17:28:07.207 回答
1

您需要使用 FirstOrDefault 或 SingleOrDefault 之类的东西来运行查询并返回单个对象。

IPACS_Certification doesExist = db.IPACS_Certification.Where(m => m.adUserName == item && m.procedureID == procedureID).Select(m => m).FirstOrDefault();
于 2013-07-25T17:28:13.543 回答
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
} 
于 2013-07-25T17:28:43.653 回答