Linq给出错误的第一种方法

时间:2012-12-27 11:54:15

标签: c# .net wcf linq entity-framework

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

2 个答案:

答案 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();