0

WCF RestサービスのWebメソッドで、以下のような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;

レコードがない場合、「シーケンスに要素が含まれていません」という例外がスローされます。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 に答える