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