#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.14. @RajdeepDebnath Когда вы группируете, он запускается на стороне сервера, и поскольку поле не существует в таблице, оно завершается с ошибкой. Для этого необходимо «синтетически» использовать статическое значение в сгенерированном sql