[英]How to aggregate more than two entities using Linq for a SelectMany?
[英]Using LINQ to Entities extension methods for more than one entity type
我有以下擴展方法:
public static IQueryable<Employee> WhereStatus(this IQueryable<Employee> queryable, string status)
{
var result = queryable
.Where(e => e.EmployeeStatus.Where(s => s.StatusEndDate == null).Select(s => s.Status)
.FirstOrDefault() == status);
return result;
}
public static IQueryable<Employee> WhereCostCenter(this IQueryable<Employee> queryable, int costCenterID)
{
var result = queryable
.Where(e => e.CostCenterID == costCenterID);
return result;
}
我幾乎在每個LINQ查詢中都需要這些擴展方法,以根據幾個參數(例如:狀態,成本中心,性別等等)將查詢過濾到某些員工。 現在我正在使用它:
using (DB db = new DB())
{
var emps = from em in db.Employees
.WhereStatus("Active")
.WhereCostCenter(112)
select em.EmpID;
var courses = from cr in db.Courses
where c.Contains(cr.EmpID)
select cr;
// now I have the filtered list of the courses I want
.....
}
問題:這是最佳做法嗎? 或者有沒有辦法讓擴展方法適用於我擁有的所有實體類型,因為所有實體都有一個EmpID? 就像是:
var courses = from em in db.Courses
.WhereStatus("Active") // use the extension methods directly here as well
.WhereCostCenter(112)
select cr;
問題是並非所有實體都具有使用所有擴展方法所必需的屬性。 您可以做的是創建屬性的子集,並將它們放入接口。
例:
public interface IHaveCostCenterID
{
public int CostCenterID {get; set;}
}
public partial class Employee : IHaveCostCenterID
{
}
public partial class Department : IHaveCostCenterID
{
}
public static IQueryable<IHaveCostCenterID> WhereCostCenter(this IQueryable<IHaveCostCenterID> queryable, int costCenterID)
{
var result = queryable
.Where(e => e.CostCenterID == costCenterID);
return result;
}
其他方式:
public static class Extension
{
public static IQueryable<TEntity> WhereCostCenter<TEntity>(
this IQueryable<TEntity> queryable, int costCenterID)
where TEntity : IHaveCostCenterID
{
var result =
queryable.Where(e => e.CostCenterID == costCenterID);
return result;
}
}
public interface IHaveCostCenterID
{
int CostCenterID { get; set; }
}
public partial class Employee : IHaveCostCenterID
{
public int CostCenterID { get; set; }
}
public partial class Department : IHaveCostCenterID
{
public int CostCenterID { get; set; }
}
這可以是使用泛型方法來提取公共代碼的解決方案,而不僅僅是LINQ。 只要你有兩個(或更多)相同的代碼片段,除了碰巧使用不同的類之外,你可以這樣做。 將公共部分提取到接口中,並使通用方法使用接口約束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.