Может ли мульти-отображение Petapoco обрабатывать несколько JOIN? - PullRequest
8 голосов
/ 12 июля 2011

У меня есть список объектов, которые я использую для заполнения с помощью Petapoco.

Свойства и имена классов обрабатывают схему базы данных. Основным классом является Issue , и он связан с двумя другими классами, имена и свойства которых также соответствуют схеме базы данных: Condition и SeverityLevel .

public class Issue
{
    public int Id { get; set; } // Primary key

    /* Some properties... */
    public DateTime? CreatedOn { get; set; }
    public string CreatedBy { get; set; }
    public DateTime? ModifiedOn { get; set; }
    public string ModifiedBy { get; set; }

    /* ... */

    // Related source and target conditions
    [PetaPoco.Ignore]
    public Condition SourceCondition { get; set; }

    [PetaPoco.Ignore]
    public Condition TargetCondition { get; set; }

    // Related severity level
    [PetaPoco.Ignore]
    public SeverityLevel CurrentSeverityLevel { get; set; }
}

public class Condition
{
    public int Id { get; set; } // Primary Key
    public string Description  { get; set; }
}

public class SeverityLevel
{
    public int Id { get; set; } // Primary key
    public string Description { get; set; }
    public string HexColorDisplay { get; set; }
}

На самом деле, когда я получаю список проблем, я использую функцию многократного отображения для получения проблемы списка и связанных с ним SeverityLevel используя одну команду:

var Results = Db.Fetch<Issue, SeverityLevel, Issue>(
    (i, sl) => { 
        i.CurrentSeverityLevel = sl;
        return i;
    },
    "SELECT /* ..shortened.. */ FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "WHERE Issue.Id=@0", issueId);

Теперь, поскольку Petapoco, похоже, не обрабатывает несколько JOINS, мне нужно сделать второй шаг, чтобы присоединить SourceCondition и TargetCondition к каждой проблеме, которую я получил.

Для этого я мог бы:

  • присоедините условие «Источник» и «Цель» после чтения в цикле foreach,
  • или получите весь список Условий, затем приложите их к каждому Выпуску, используя тот же тип for-each.

Пока я использую второе решение, поскольку в базе данных имеется ограниченный набор Условий.

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

Интересно, смогу ли я добиться, чтобы заставить работать что-то вроде этого:

var Results = Db.Fetch</* ????? */>(
    /* ???? */
    "SELECT /* ..shortened.. */ FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "LEFT JOIN Condition Con1 ON Con1.Id = Issue.SourceConditionId " + 
    "LEFT JOIN Condition Con2 ON Con2.Id = Issue.TargetConditionId " + 
    "WHERE Issue.Id=@0", issueId);

Уважаемые пользователи Petapoco, дорогой автор Petapoco, это способ справиться с этим?

Могу ли я использовать Dapper для решения этой проблемы (если это возможно ...), appart, я абсолютно хочу оставить Petapoco для моих операций обновления / вставки?

1 Ответ

13 голосов
/ 12 июля 2011

Это должно быть в состоянии сделать.

var Results = Db.Fetch<Issue, SeverityLevel, Condition, Condition, Issue>(
    (i, sl, c1, c2) => { 
        i.CurrentSeverityLevel = sl;
        i.SourceCondition = c1;
        i.TargetCondition = c2;
        return i;
    },
    "SELECT Issue.*, SeverityLevel.*, Con1.*, Con2.* FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "LEFT JOIN Condition Con1 ON Con1.Id = Issue.SourceConditionId " + 
    "LEFT JOIN Condition Con2 ON Con2.Id = Issue.TargetConditionId " + 
    "WHERE Issue.Id=@0", issueId);

Я не проверял это. Я также работаю над тем, как это автоматизировать.

Это действительно важно, чтобы выбранные столбцы были в том же порядке, что и типы параметров.

...