2017-08-08 4 views
1

私はシンプルなベンダー持っている - 次のセットアップ(非関連のプロパティは省略さ)と>製品関係:私は柔らかいこの場合には削除してLeftJoin()を使用してみましたを使用していServiceStack ORMLite LeftJoin混乱

public class Vendor 
{ 
    public Guid Id { get; set; } 
    public bool IsDeleted { get; set; } 

    [Reference] 
    public List<Product> Products {get; set; } 
} 

public class Product 
{ 
    public Guid Id { get; set; } 
    public bool IsDeleted { get ; set; } 

    [ForeignKey(typeof(Vendor))] 
    public Guid VendorId {get; set; } 
} 

を参照された製品と削除されていない製品のリストを持つベンダーを検索します。私の最初の試みは成功しなかったし、私はLeftJoin()クエリを使用して参照でエンティティを移入するためにLoadSelect()を使用しようとしていたことが左の結合の問題だと思う。しかし、実際には、参加者はベンダを特定するために使用されており、LoadSelect()は、そのベンダのためにプロダクトを設定しました。多くのテストとグーグルの後、私は次のコードを実行しますが、2つのステップのプロセスです。

public async Task<Vendor> GetVendorProductsAsync(Guid vendorId) 
{ 
    using (var con = DbFactory.Open()) 
    { 
     try 
     { 
      var vendor = (await con.SelectAsync<Vendor>(v => v.Id == vendorId && !v.IsDeleted)).SingleOrDefault(); 
      if (vendor != null) 
      { 
       var products = await con.SelectAsync<Product>(p => p.VendorId == vendorId && !p.IsDeleted); 
       vendor.Merge(products); 
      } 
      return vendor; 
     } 
     catch (Exception ex) 
     { 
      Log.Error(ex, "{@LastSql}", con.GetLastSql()); 
      throw; 
     } 
    } 
} 

Iは、結合を実行すると、次にORMLiteは、単一ステップでベンダーと参照/濾過製品でエンティティをロードするためにデータベースを使用することを好むだろう。 ORMLiteを使用するとLeftJoin()を使用して、IsDeletedがfalseの参照先の製品のみを読み込むことはできますか?

答えて

2

LoadSelectのクエリがクエリされたベンダにのみ影響することを発見したため、ベンダ参照された製品データをフィルタリングするのには使用されず、現在ロードされている参照データを変更する方法はありません。だから、利用可能なソリューション

は例えば、別の要求を行い、あなたがやっているようPOCO merge APIを使用するか、またはLoadSelectを使用するのではなく、後にクライアント上で削除された製品を削除することです:インフォ良いことだ

var vendors = db.LoadSelect<Vendor>(x => !x.IsDeleted); 
vendors.Products.RemoveAll(x => x.IsDeleted); 
+0

はあなたに感謝します - 1ベンダーあたりの製品数が少ないため、クライアントでの削除はおそらく最も効果的であり、ネットワーク要求を保存します。 –