Как вы обрабатываете связи с другими таблицами с помощью PetaPoco?

Например, если у меня есть POCO для форума и один для ForumPost, как я могу элегантно вернуть список сообщений ForumPost и указать это право в модели. Сейчас я делаю это вручную, добавляя вызов db.Query непосредственно в свойство List, но есть ли лучший способ?

[TableName("Forum")]
[PrimaryKey("ForumID")]
[ExplicitColumns]
public class Forum : BaseModel
{
    [Column]
    public int ForumID { get; set; }
    [Column]
    public string ForumName { get; set; }
    [Column]
    public string ForumDescription { get; set; }
    [ResultColumn]
     public List<ForumPost> {
        get

{ // возвращаем список ForumPost - как лучше с этим справиться? } } }


person Shane    schedule 19.06.2012    source источник


Ответы (1)


Я написал для этого статическое расширение, поэтому я могу установить это в своем свойстве следующим образом (используя некоторые из моих классов). Это свойство будет в вашей модели POCO:

 private List<AssessmentAssignment> _AssessmentAssignments;
    [ResultColumn]
    public List<AssessmentAssignment> AssessmentAssignments
    {
        get
        {
            return ServiceExtensions<AssessmentAssignment>.GetRelatedList(this.GetType());
        }
        set
        {
            _AssessmentAssignments = value;
        }
    }

Вот ServiveExtension, который я написал для этого, но пока не уверен, что мне это нравится. Это работает, но мда. У кого-нибудь есть идеи получше?

 public static class ServiceExtensions<T> where T : class, new()
{
    /// <summary>
    /// Experimental way to retrieve a foreign key related list with PetaPoco
    /// </summary>
    /// <param name="PrimaryTableType"></param>
    /// <returns></returns>
    public static List<T> GetRelatedList(Type PrimaryTableType)
    {
        var primaryTableData = PocoData.ForType(PrimaryTableType);
        var relationshipTableData = PocoData.ForType(typeof(T));

        using (PetaPoco.Database db = new PetaPoco.Database("ConnStringName"))
        {
            PetaPoco.Sql sql = new PetaPoco.Sql("SELECT A.* FROM " + relationshipTableData.TableInfo.TableName + " A")
            .Append("JOIN " + primaryTableData.TableInfo.TableName + " B ON A." + primaryTableData.TableInfo.PrimaryKey + " = B." + primaryTableData.TableInfo.PrimaryKey);

            return db.Fetch<T>(sql);
        }
    }
}
person Shane    schedule 20.06.2012
comment
Я вижу две проблемы с этим: одна заключается в том, что данные загружаются лениво, а другая заключается в том, что в зависимости от того, сколько у вас вложенных таблиц, вы можете получить несколько отдельных выполняемых запросов, которые могли быть удовлетворены только одним запросом. - person The Muffin Man; 04.07.2014