2016-05-25 29 views
0

私のポコスでは、1対多および多対多のSQL関係をリストにマッピングするのが難しいです。私はフェッチとクエリのすべてのやり方と属性を試してきました。ポコスを適切にマッピングできていません。ここではクラスとSQLの簡易版です:NPoco多対多多対多

POCOS:

[NPoco.TableName("Product")] 
[NPoco.PrimaryKey("ProductId")] 
public class Product 
{ 
    public int ProductId { get; set; } 
    public List<Category> Categories { get; set; } 
    public string Name { get; set; } 
    public List<ProductVariant> ProductVariants { get; set; } 
} 

[NPoco.TableName("Category")] 
[NPoco.PrimaryKey("CategoryId")] 
public class Category : ModifiedDomainObject 
{ 
    public int CategoryId { get; set; } 
    public string Name { get; set; } 
} 

[NPoco.TableName("ProductVariant")] 
[NPoco.PrimaryKey("ProductVariantId")] 
public class ProductVariant : ModifiedDomainObject 
{ 
    public int ProductVariantId { get; set; } 
    public string Name { get; set; } 
} 

SQLクエリ:

SELECT[Product].[ProductId], 
[Product].[PublicId], 
[Product].[Name], 
[Category].[CategoryId], 
[Category].[Name], 
[ProductVariant] 
[ProductVariantId], 
[ProductVariant].[ProductId], 
[ProductVariant].[Name], 
FROM[Product] 
JOIN[ProductCategory] on[ProductCategory].[ProductId] = [ProductCategory].[ProductId] 
JOIN[Category] ON[ProductCategory].[CategoryId] = [Category].[CategoryId] 
LEFT OUTER JOIN[ProductVariant] ON[Product].[ProductId] = [ProductVariant].[ProductId] 
WHERE[Product].[ProductId] = 1 
ORDER BY[Product].[ProductId], 
[Category].[CategoryId], 
[ProductVariant].[ProductVariantId]; 

ので、製品 - > ProductVariantはProductVariantで、1対多のですProductIdを搭載したテーブル。 Product-> CategoryはProductIdとCategoryIdを持つxrefテーブル[ProductCategory]を持つ多対多です。私が得た最も近いのは、ProductVariantリストに正しい数のオブジェクトが移入されていますが、値はProductデータからマップされています。

私はPetaPocoで長年働いており、NPoco V3に「アップグレード」しようとしています。 PetaPocoの場合、私はRelatorを使ってマッピングを行います。 NPocoを使用すると、オンラインの例は私のためには機能しません。

答えて

0

NPoco 3では、1対1または多対多の関係しかマッピングできません。

例が正常に動作するために必要な項目は、Productクラスの[NPoco.PrimaryKey( "ProductId")]タグです。

だから、この操作を行います。これは、カテゴリのリストで、またはProductVariantsのリスト、両方ではないとあなたの製品のリストを取得します

string sql = "sql with product-categorie relation"; 
List<Product> products = db.Fetch<Product>(x => x.Categories, sql); 

または

string sql = "sql with product-productVariant relation"; 
List<Product> products = db.Fetch<Product>(x => x.ProductVariants, sql); 

を。

あなたは、その後、最初の使用カテゴリの製品のリストを取得し、することができます

foreach(Product aProduct in products) 
{ 
    string productVariantSQL = "SQL to retrieve productVariant for current product"; 
    aProduct.ProductVariants = db.Fetch<ProductVariant>(productVariantSQL); 
} 
+0

は私が正しいと信じている、あなたの答えをいただき、ありがとうございます。唯一の解決策は、PetaPocoから一歩後退しているように見えるN + 1の動作(100個の製品= 101 SQLクエリ)です。 – RobertMGlynn