在查询中使用unmapped属性:调用lambda表达式vs“duplicating”属性

时间:2016-10-20 08:44:50

标签: c# entity-framework linq lambda

我有一个带有Item表的ASP.NET MVC代码第一个项目,我有很多查询需要按项目属性进行过滤或排序。
以下是包含数据库列的(简化)部分类:

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直接在我的查询中使用AvailableQuantityToList()属性,但我希望避免出现此问题。 因此,我认为我需要为我的查询创建类似的东西:

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 lambda表达式检索一个特定实例的结果,所以我应该从函数partial class中调用表达式,这样代码就不会重复了吗?有任何性能问题吗?我应该保留属性重复吗?或者任何其他解决方案允许在查询中使用那些未映射的属性而不会出现性能问题?

0 个答案:

没有答案