0

在我的 WCF 休息服务的网络方法中,我试图使用 Linq 的第一种方法查找记录,如下所示

  [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 的选项。我对此真的很陌生,所以可能我错过了一些可以描述解决方案的链接。如果第一种方法失败,请帮助我或建议我以其他方式进行错误处理

4

2 回答 2

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);
    }
}
于 2012-12-27T11:57:56.847 回答
0

尝试

var dbVersionentity = _productVersionEntityRepository.Where(x => x.Id == detail.Id).FirstOrDefault();
于 2012-12-27T11:57:21.530 回答