簡體   English   中英

如何將謂詞轉換為 C# 中的泛型謂詞?

[英]How to convert my predicate to a generic predicate in C#?

我有一個完美運行的謂詞代碼,但我想減少我的代碼並將其轉換為通用代碼並在我的存儲庫中使用它

public abstract class RequestParameters
{
    const int maxPageSize = 5;
    public int PageNumber { get; set; } = 1;

    private int _pageSize = 10;
    public int PageSize
    {
        get
        {
            return _pageSize;
        }
        set
        {
            _pageSize = (value > maxPageSize) ? maxPageSize : value;
        }
    }
    public string OrderBy { get; set; }
    public string Fields { get; set; }
}

這是我的 EmployeeSearchModel

public class EmployeeSearchModel : RequestParameters
{
    public EmployeeSearchModel()
    {
    
        OrderBy = "name";
    }       

    public string Name { get; set; }
    public int Age { get; set; }
    public string Position { get; set; }

    public Expression<System.Func<Employee, bool>> Go()
    {
        var predicate = PredicateBuilder.True<Employee>();

        if (!string.IsNullOrEmpty(Name))
        {
            predicate = predicate.And(i => i.Name.ToLower().Contains(Name.ToLower()));
        }
        if (!string.IsNullOrEmpty(Position))
        {
            predicate = predicate.And(i => i.Position.ToLower().Contains(Position.ToLower()));
        }
        return predicate;
    }
}

這是我的存儲庫

public async Task<PagedList<Employee>> GetEmployeesAsyncExp(EmployeeSearchModel employeeParameters)
    {
        Expression f = employeeParameters.Go();

        var employees = await FindByCondition(employeeParameters.Go())
        .OrderBy(e => e.Name)           
        .ToListAsync()....

....

現在我想把它改成這樣的通用內容:

public class EmployeeSearchModel<T> : RequestParameters ...

好吧,這里沒有真正的問題,還有很多缺失的信息和錯誤信息。 我想你會想要交換“員工”類,以便用你的 SearchModel 部分過濾其他類。 因此“EmployeeSearchModel”是錯誤的,因為它仍然包含雇員。

另一方面,您的方法使用了一些 Employee 特定部分,如 Name 或 Age,除非您的其他類也包含 Age 和 Name,否則這不能用作方法通用。

重用 SearchModel 的最佳部分是將其更改為抽象類並讓 EmployeeSearchModel 繼承它:

public abstract class SearchModel<T> : RequestParameters
{
    public abstract Expression<System.Func<T, bool>> Go();
}

public class EmployeeSearchModel : SearchModel<Employee>
{
    public EmployeeSearchModel()
    {

        OrderBy = "name";
    }

    public string Name     { get; set; }
    public int    Age      { get; set; }
    public string Position { get; set; }

    public override Expression<Func<Employee, bool>> Go()
    {
        var predicate = PredicateBuilder.True<Employee>();

        if (!string.IsNullOrEmpty(Name))
        {
            predicate = predicate.And(i => i.Name.ToLower().Contains(Name.ToLower()));
        }
        if (!string.IsNullOrEmpty(Position))
        {
            predicate = predicate.And(i => i.Position.ToLower().Contains(Position.ToLower()));
        }
        return predicate;
    }
}

然后,您還可以使用它來搜索其他類,例如公司:

public class CompanySearchModel : SearchModel<Company>
{
    public string Department {get; set;}

    public override Expression<Func<Company, bool>> Go()
    {
        var predicate = PredicateBuilder.True<Company>();

        if (!string.IsNullOrEmpty(Department))
        {
            predicate = predicate.And(x => x.Department.ToLower().Contains(Department.ToLower()));
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM