Может ли мультимаппинг Petapoco обрабатывать несколько JOIN?

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

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

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

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

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,
  • или получить весь список условий, а затем прикрепить его к каждому выпуску, используя один и тот же вид для каждого.

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

Как бы то ни было, мне кажется, что делать таким образом немного сложно, потому что для этого требуется выполнить почти столько же запросов, сколько добавляется 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 (если он может...), кроме того, я абсолютно хочу сохранить Petapoco для моих операций обновления/вставки?


person Larry    schedule 12.07.2011    source источник


Ответы (1)


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

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

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

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

person Schotime    schedule 12.07.2011
comment
Это работает ! Большое спасибо. Я думаю, что мы достигли предела здесь, так как я не могу добавить больше объединений. - person Larry; 13.07.2011
comment
Это возможно, вам просто нужно использовать неуниверсальную перегрузку или, если вы используете dotnet 4.0, вы можете добавить свои собственные перегрузки, которые принимают больше параметров. 4 - это предел .net 3.5. - person Schotime; 14.07.2011