работа со свойством, которое не отображается непосредственно на столбец в базе данных - PullRequest
1 голос
/ 08 февраля 2012

У меня есть следующие таблицы

Таблица клиентов и таблица продуктов

ID
Name

Таблица клиентских продуктов

ID
ClientID
ProductID

Класс продукции

 private int id;
    public int ID
    {
        get { return id; }
        set { id = value; }
    }
     protected string name;

    public Product () { }

    public Product (string name)
    {
        this.name = name;
    }

    public Product (string name)
    {
        this.name = name;
    }   
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

Клиентский класс

     private int id;
    public int ID
    {
        get { return id; }
        set { id = value; }
    }
     protected string name;

    public Client () { }

    public Client (string name)
    {
        this.name = name;
    }

    public Client (string name)
    {
        this.name = name;
    }   
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

КлиентПродукт класса

        protected Client client;
    protected Product product;

    public ClientProduct  () { }

    public ClientProduct  (Client client,  Product product)
    {
        this.client= client;
        this.product= product;
    }

    public Client client        {
        get { return client; }
        set { client= value; }
    }

    public Product product      {
        get { return product; }
        set { product= value; }
    }

Как я могу сделать следующее в petaPOCO?

    public static System.Collections.Generic.IList<ClientProduct> LoadForClient(Client client)
    {
        if (null != client)
            return Load("ClientID = " + client.ID);
        else
            return null;
    }

так, что у меня может быть список всех продуктов для этого клиента, которые я позже буду использовать в моем представлении как

 private void LoadProducts(Client client )
    {
        Products = ClientProduct.LoadForClient(client)
            .Select(x => x.Product.Name)
            .OrderBy(x => x).ToArray();
    }

1 Ответ

0 голосов
/ 11 февраля 2012

Соотношение 1: M и M: 1 похоже на то, что вы ищете http://www.toptensoftware.com/Articles/115/PetaPoco-Mapping-One-to-Many-and-Many-to-One-Relationships

Вы можете определить собственный обратный вызов relator; Пример Брэда для двух таблиц (если ваши продукты сопоставлены непосредственно с клиентом) будет выглядеть примерно так:

var posts = db.Fetch<Product, Client, ClientProduct>(
    (p,c)=> { p.client_obj = c; return p; },
    @"SELECT * FROM Product
    LEFT JOIN Client ON Product.clientId = Client.id ORDER BY Product.clientId 
    ");

Я понимаю, что вы имеете дело с отношениями M: M, поэтому вам нужно обновить вышеприведенное, чтобы отобразить три объекта, но концепция та же. Ключ в том, что ваш третий аргумент в вызове (ClientProduct) представляет объединенную строку, и вы можете ссылаться на клиента и / или продукты непосредственно из единого списка.

...