Результат сопоставления Dapper с включенным типом примитива - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь запросить базу данных для довольно небольшого (~ 80 строк) набора данных, где мне нужно включить примитив BIT, указывающий, является ли TestPartItem последним элементом TestPart, используя следующий запрос:

SELECT tpt.[Name] TestPartTypeName,  1 AS split,
tpi.Number, tpi.Header, tpi.Instruction, tpi.Answer, tpi.[Description], 
tpi.Letter, 1 AS split,
tpo.Label, tpo.ImageFileName, 1 AS split,
CASE WHEN 
    (SELECT MAX(TestPartItemID) FROM TestPart_TestPartItem WHERE TestPartID = 1) = tpi.ID 
    THEN CAST(1 AS BIT)
    ELSE CAST(0 AS BIT) 
END AS IsLastItemInTestPart
FROM TestPart tp
JOIN TestPartType tpt ON tpt.ID = tp.TestPartTypeID
JOIN TestPart_TestPartItem tptpi ON tptpi.TestPartID = tp.ID
JOIN TestPartItem tpi ON tpi.ID = tptpi.TestPartItemID
JOIN TestPartItem_TestPartItemOption tpitpo ON tpitpo.TestPartItemID = tpi.ID
JOIN TestPartItemOption tpo ON tpo.ID = tpitpo.TestPartItemOptionID
WHERE tpi.ID = 1 AND tp.ID = 1

Хотя я точно знаю, что могу добавить поле битов в таблицу TestPartItem, оно не будет работать из-за отношения «многие ко многим» между TestPart s и TestPartItem - заданным TestPartItem не обязательно последний элемент из всех TestParts

var testPartItemDictionary = new Dictionary<int, TestPartItem>();

TestPartItemAggregate aggregate = new TestPartItemAggregate();

var result = conn.Query<TestPartType, TestPartItem, TestPartItemOption, bool, TestPartItem>(sql, (testPartType, testPartItem, testPartItemOption, IsLastItemInTestPart) =>
                                                                                            {
  TestPartItem tpi;

  if (!testPartItemDictionary.TryGetValue(testPartItem.ID, out tpi))
  {
    tpi = testPartItem;
    aggregate.IsLastInTestPart = IsLastItemInTestPart;
    aggregate.TestPartTypeName = testPartType.Name;

    testPartItemDictionary.Add(testPartItem.ID, tpi);
  }

  tpi.TestPartItemOptions.Add(testPartItemOption);

  return tpi;
}, splitOn: "split").Distinct().ToList();

aggregate.TestPartItem = testPartItemDictionary.Values.First();

Отображение объекта без IsLastItemInTestPart bool работает должным образом, но при добавлении bool выдается исключение с сообщением: «Invalid cast»

Я просто слишком много спрашиваю у Даппера, комбинируя строго типизированные объекты с примитивами? : -)

Заранее спасибо.

1 Ответ

0 голосов
/ 07 мая 2019

Когда вы выбираете 1 как split, split - это целое число, а не бит. Вы должны вернуть CAST (1 AS BIT) AS split, если хотите, чтобы это работало. :)

...