SQL-запрос не возвращает тот же результат в SQL Server и в C # - PullRequest
0 голосов
/ 26 апреля 2019

Я запустил запрос в двух разных средах:

  • Microsoft SQL Server Management Studio
  • C # (.Net Core 2.2.1)

Запрос:

SELECT
    CASE 
       WHEN afc.Id IS NULL 
          THEN fcv.Id 
          ELSE afc.ParentTemplateFieldContainerId 
    END AS FieldContainerId,
    fcv.TemplateFieldContainerId,
    CASE 
       WHEN fcvp.ProductId IS NULL 
          THEN '00000000-0000-0000-0000-000000000000' 
          ELSE fcvp.ProductId 
    END AS ProductId
FROM 
    FieldContainerValue fcv
LEFT JOIN
    FieldContainerValueAndProduct fcvp ON fcvp.FieldContainerValueId = fcv.Id
LEFT JOIN
    ArrayFieldContainer afc ON afc.ChildTemplateFieldContainer = fcv.Id
WHERE 
    fcv.Id IN ('337c0b2e-a83b-4014-a46a-6ce8bf9fd2c4', 'c2ca899c-28ac-4dc3-bba9-f0741bb02097')

Код, который я использовал для запуска запроса в C #:

public IEnumerable<T> QuerySql<T> (string sql)
{
    using (var conn = new SqlConnection(ConfigMan.GetConfigProperty("ConnectionString")))
    {
        conn.Open();
        conn.EnlistTransaction(Transaction.Current);
        return conn.Query<T>(sql);
    }
}

SQL - это запрос.

Тип, который возвращает мой запрос:

public class FieldContainerValueProperties
{
    public Guid FieldContainerValueId { get; set; }
    public Guid TemplateFieldContainerId { get; set; }
    public Guid ProductId { get; set; }
}

Результаты запроса: в обоих случаях я получаю одинаковое количество предметов (2), но FieldContainerId отличается.

В SQL Server Management Studio:

[
    {
        "FieldContainerId": "337C0B2E-A83B-4014-A46A-6CE8BF9FD2C4",
        "TemplateFieldContainerId": "B4566675-B547-4025-ABBB-F5CC523BB092",
        "ProductId": "6E790000-FF4B-0003-C22D-08D68AB637D6"
    },
    {
        "FieldContainerId": "C2CA899C-28AC-4DC3-BBA9-F0741BB02097",
        "TemplateFieldContainerId": "591D8371-EDE8-460C-9847-3F2963D875D2",
        "ProductId": "6E790000-FF4B-0003-C22D-08D68AB637D6"
    }
]

Из C #:

[
    {
        "FieldContainerId": "00000000-0000-0000-0000-000000000000",
        "TemplateFieldContainerId": "B4566675-B547-4025-ABBB-F5CC523BB092",
        "ProductId": "6E790000-FF4B-0003-C22D-08D68AB637D6"
    },
    {
        "FieldContainerId": "00000000-0000-0000-0000-000000000000",
        "TemplateFieldContainerId": "591D8371-EDE8-460C-9847-3F2963D875D2",
        "ProductId": "6E790000-FF4B-0003-C22D-08D68AB637D6"
    }
]

Возможные объяснения?

Одно возможное объяснение, которое я могу себе представить, состоит в том, что в одном случае is null вернул true, а в другом случае false, но я действительно не уверен.

Если это действительно так, знаете ли вы, что может вызвать эту проблему?

1 Ответ

6 голосов
/ 26 апреля 2019

Ваше отображение не работает.Класс вашей модели содержит FieldContainerValueId и вашу таблицу sql FieldContainerId, поэтому, когда он отображает имена полей, они отличаются и устанавливают значение по умолчанию.Измените свой класс модели FieldContainerValueId -> FieldContainerId.Новая модель, которая будет работать нормально,

public class FieldContainerValueProperties
{
    public Guid FieldContainerId { get; set; }
    public Guid TemplateFieldContainerId { get; set; }
    public Guid ProductId { get; set; }
}

** Я ответил на это в разделе комментариев.Пишите здесь, чтобы просто получить сообщение с разрешенным ответом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...