Использовать не сопоставленное свойство в запросе: вызов лямбда-выражения против свойства «дублирование»

#c# #entity-framework #linq #lambda

#c# #entity-framework #linq #лямбда

Вопрос:

У меня есть ASP.NET Первый проект кода MVC с Item таблицей, и у меня есть много запросов, в которых мне нужно фильтровать или упорядочивать по свойствам элементов.
Вот (упрощенный) частичный класс, содержащий столбцы базы данных:

 public partial class Item
{
    public Item()
    {
        this.Squares = new HashSet<Square>();
        this.Sales = new HashSet<Sale>();
    }

    public Guid Id { get; set; }
    public int Quantity { get; set; }

    [InverseProperty("Item")]
    public virtual ICollection<Square> Squares { get; set; }
    [InverseProperty("Item")]
    public virtual ICollection<Sale> Sales { get; set; }
}
  

И вот (упрощенный) связанный частичный класс, содержащий функциональные свойства:

 public partial class Item
{
    public int UsedQuantity
    {
        get
        {
            var nbUsedInDomain = Squares != null ? Squares.Count() : 0;
            var nbForSale = Sales != null ? Sales.Sum(s => s.Quantity) : 0;
            return nbUsedInDomain   nbForSale;
        }
    }

    public int AvailableQuantity
    {
        get { return Quantity - UsedQuantity; }
    }
}
  

Я думаю, что мог бы использовать свойства UsedQuantity и AvailableQuantity непосредственно в своих запросах, используя ToList() но я хотел бы избежать этого из-за проблем с производительностью.
Таким образом, я думаю, мне нужно было бы создать что-то подобное для моих запросов:

 public static Expression<Func<Item, int>> GetAvailableQuantity()
    {
        return i => i.Quantity -
            (
                (i.Squares.Any() ? i.Squares.Count : 0)  
                (i.Sales.Any() ? i.Sales.Sum(s => s.Quantity) : 0)
            );
    }
  

Но это каким-то образом «дублирует» AvailableQuantity свойство в другом Item частичном классе, и это означало бы, что каждое свойство, используемое для фильтрации или сортировки, также должно дублироваться.

Я читал, что могу Invoke с помощью лямбда-выражения получить результат для одного конкретного экземпляра, так должен ли я вызывать выражение из функционального частичного класса, чтобы код не дублировался? Есть ли какие-либо проблемы с производительностью? Должен ли я сохранять дублированные свойства? Или любое другое решение, позволяющее использовать эти не сопоставленные свойства в запросе без проблем с производительностью?

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

1. Используете ли вы entity Framework? Пожалуйста, добавьте более подробные теги!

2. Извините, да, я на самом деле использую EF 😉