Как выбрать постоянное значение в EFCore 3.1 без пользовательского sql

#entity-framework-core #iqueryable

#entity-framework-core #iqueryable

Вопрос:

Я бы хотел, чтобы EFCore сгенерировал эквивалент «выберите имя, цвет, ‘неприменимо’ в качестве позиции из таблицы

У меня есть несколько объектов в контексте, где мне нужно передать IQueryable в универсальную функцию, которая будет группировать (x => x.Position). Если я отмечу позицию как NotMapped, GroupBy не будет выполнять серверную часть. Я пробовал всевозможные комбинации, пытаясь использовать ValueGeneratedOn … и ComputedSql, но безуспешно.

В приведенном ниже примере ActivityWithRealQty имеет конфигурацию, которая сопоставляет все 3 поля со столбцами в БД, но ActivityWithStaticQty не имеет поля в БД для количества. Однако я хочу, чтобы оно возвращало 1 в качестве статического значения, чтобы GroupBy корректно работал на стороне сервера.

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApp1
{
    public class Class1
    {
        private IEnumerable<ResultActivity> GroupData(IQueryable<IActivity> data)
        {
            var rtn = data.GroupBy(result => new
            {
                result.Name,
                result.Title
            })
            .Select(x => new ResultActivity()
            { 
                Name = x.Key.Name,
                Title = x.Key.Title,
                Quantity = x.Sum(n => n.Quantity)
            })
            .ToList();

            return rtn;
        }
    }

    public class ResultActivity
    {
        public ResultActivity()
        {
        }

        public string Name { get; set; }
        public string Title { get; set; }

        public int Quantity { get; set; }
    }

    public interface IActivity
    {
        public string Name { get; set; }
        public string Title { get; set; }

        public int Quantity { get; set; }
    }

    public class ActivityWithStaticQty : IActivity
    {
        public string Name { get ; set ; }
        public string Title { get; set; }
        public int Quantity { get; set; } = 1;
    }

    public class ActivityWithRealQty : IActivity
    {
        public string Name { get; set; }
        public string Title { get; set; }
        public int Quantity { get; set; }
    }
}
  

Комментарии:

1. Я думаю, это поможет, если вы покажете нам код. Соберите пример как часть вашего вопроса.

2. В исходное сообщение добавлен код @Mo-Gang

3. Я думаю, GorupBy недоступно в EFCore 3.1

4. @RajdeepDebnath Когда вы группируете, он запускается на стороне сервера, и поскольку поле не существует в таблице, оно завершается с ошибкой. Для этого необходимо «синтетически» использовать статическое значение в сгенерированном sql