2016-05-25 1 views
0

У меня возникли трудности с сопоставлением отношений «один ко многим» и «многие ко многим» SQL со списками в моих pocos. Я пробовал все виды Fetch и Query, а также атрибуты, и я не получал правильно сопоставленные pocos. Вот упрощенная версия классов и SQL:NPoco One-To-Many и Many-To-Many

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]; 

Так, Product-> ProductVariant это один-ко-многим, с ProductVariant таблица переносится ProductId; а Категория продукта -> «Много-ко-многим» с таблицей xref [ProductCategory], в которой хранятся ProductId и CategoryId. Самое близкое, что я получил, это список ProductVariant, заполненный правильным количеством объектов, но значения отображаются из данных Product.

Я работал с PetaPoco в течение длительного времени, и теперь я пытаюсь «обновить» до NPoco V3. Где с PetaPoco я бы использовал Relators для отображения; с NPoco примеры онлайн не работают для меня.

ответ

0

С NPoco 3 вы можете отображать только одно отношение «один ко многим» или «многие ко многим».

Элемент, который должен присутствовать в примерах для работы, это тег [NPoco.PrimaryKey («ProductId»)] в классе Product.

Так вы сделаете это:

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); 

Это поможет вам список продуктов со списком категорий, или со списком ProductVariants, но не оба.

Вы можете использовать первый, получить список продуктов с категориями, а затем:

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

Спасибо за ваш ответ, который я считаю правильным. Единственное разрешение приводит к поведению N + 1 (100 продуктов = 101 SQL-запросов), которое похоже на шаг назад от PetaPoco, поскольку я его использовал. – RobertMGlynn