在我的WCF休息服务的web方法中,我试图使用Linq的First方法找到记录,如下所示
[WebInvoke(UriTemplate = "UpdateProductObject", Method = "PUT")]
public Result UpdateProductObject(ProductObjectToSave prodSave)
{
IUnitOfWork unitOfWork = new UnitOfWork((IObjectContext)_objectSetFactory);
var versions = prodSave.VersionDetails;
foreach (var versionDetail in versions)
{
var detail = versionDetail;
var dbVersionentity = _productVersionEntityRepository.First(x => x.Id == detail.Id);
if (detail.Id < 0)
{
dbVersionentity.Id = GetNextTableId("vProductVersion");
}
dbVersionentity.Name = detail.Name;
dbVersionentity.Code = detail.Name;
if (detail.Id > 0){
_productVersionEntityRepository.Update(dbVersionentity);
}
else
{
_productVersionEntityRepository.Insert(dbVersionentity);
}
}
try
{
unitOfWork.Commit();
}
catch (Exception e)
{
return new Result() { Error = e.Message };
}
return new Result() { Error = "Record updated successfully" };
}
“_productVersionEntityRepository”在我的服务中定义如下。
private readonly Repository<ProductVersionEntity> _productVersionEntityRepository;
当没有记录时,它会抛出异常“Sequence contains no elements”。我已经做了一些发现我们可以使用FirstOrDefault方法。但不知怎的,我没有得到使用FirstOrDefault的选项。我真的很陌生,所以我可能错过了一些可以描述解决方案的链接。如果第一种方法失败,请帮助我或建议我采用其他方式进行错误处理
答案 0 :(得分:2)
这就是First()的工作方式,如果无法找到该元素,它将抛出异常。您可以改用FirstorDefault()并检查元素是否为null
。
编辑:我意识到你正在使用自定义存储库。如果您有权访问源代码,我建议您添加一个名为.FirstOrDefault()
的新方法,该方法将参数作为谓词,如果没有找到实体,则返回null。
编辑2:将此方法添加到您的存储库:
T FirstOrDefault(Expression<Func<T, bool>> where, params Expression<Func<T, object>>[] includeProperties)
{
IQueryable<T> query = AsQueryable();
query = PerformInclusions(includeProperties, query);
return query.FirstOrDefault(where);
}
然后你可以在你的代码中做这样的事情:
foreach (var versionDetail in versions)
{
bool isNew = false;
var detail = versionDetail;
var dbVersionentity = _productVersionEntityRepository.FirstOrDefault(x => x.Id == detail.Id);
// not found in database
if(dbVersionentity == null)
{
isNew = true;
// create entity here
dbVersionentity = new .....;
// you don't need to do this if id is auto-generated,
// i.e. Identity column in SQL Server
dbVersionentity.Id = GetNextTableId("vProductVersion");
}
dbVersionentity.Name = detail.Name;
dbVersionentity.Code = detail.Name;
if (isNew)
{
_productVersionEntityRepository.Insert(dbVersionentity);
}
else
{
_productVersionEntityRepository.Update(dbVersionentity);
}
}
答案 1 :(得分:0)
试
var dbVersionentity = _productVersionEntityRepository.Where(x => x.Id == detail.Id).FirstOrDefault();