SQL в LINQ - Заявление о регистре - PullRequest
4 голосов
/ 11 июля 2020

Я впервые переписываю оператор SQL для LINQ. Я не совсем уверен, как правильно написать заявление по моему делу. Среде выполнения не нравится, как я ее написал (я использовал эту ссылку в качестве примера)

Моя цель - организовать мои данные с помощью оператора case. Пожалуйста, дайте мне знать, что я могу изменить для достижения sh моей цели.

Моя ошибка говорит:


    InvalidOperationException: The LINQ expression 'DbSet<Table>
    .Where(c => c.ID ==(Nullable<int>)10)
    .OrderBy(c => c.column1)
    .ThenBy(c => _sortOrder_0.TryGetValue(
    key: c.column3,
    value:_order_1)?_order_1:_defaultOrder_2)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), ToList(), or ToListAsync()

Исходный SQL запрос:


    SELECT column1, column2, column3 from table where ID = # order by column1, 
    Case column3 When 'X' Then 1 When 'Y' Then 2 When 'Z' Then 3 End

LINQ:

public async Task<IActionResult> Index()
{
    var sortOrder = new Dictionary<string, int>
        {
            {"X", 1 },
            {"Y", 2 },
            {"Z", 3 },
        };
    var defaultOrder = sortOrder.Max(x => x.Value) + 1;
    int order;
    var dataTest = _context.TableModel
        .Where(x =>
        (x.ID == 10)
        )
        .Select(x => new TableModel
        {
            column1 = x.column1,
            column2 = x.column2,
            column3 = x.column3,
        })
        .OrderBy(x => x.column1)
        .ThenBy(x => sortOrder.TryGetValue(x.column3, out order) ? order : defaultOrder)
        .AsNoTracking()
        .ToListAsync();
}

Боковое примечание: я использую ID = 10 для целей тестирования. Спасибо за уделенное время!

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Попробуйте использовать тернарный оператор для всех случаев в предложении ThenBy:

 .ThenBy(x => x.column3 == "X" 
      ? 1 
      : x.column3 == "Y" 
          ? 2 
          : x.column3 == "Z" 
                ? 3 
                : defaultOrder)
0 голосов
/ 11 июля 2020

Это будет неприятно, но ...

context.TableModel.Where(x => x.ID == 10)
    .OrderBy(x => x.column1)
    .ThenBy(x=> x.column3 == "X" ? 1
        : x.column3 == "Y" ? 2
        : x.column3 == "Z" ? 3
        : defaultOrder)
    .AsNoTracking()
    .ToListAsync();

По сути, это просто гигантский вложенный оператор if. Кроме того, оператор select является избыточным, если в вашей таблице есть только три столбца.

Я предлагаю сделать перечисление всех ваших значений column3, а затем упорядочить его. Это будет более эффективно, потому что enum присваивает значения int каждому элементу.

...