Where子句使用表达式>和& lt; T>

本文关键字:lt Func 子句 表达式 Where | 更新日期: 2023-09-27 18:14:21

这是我的代码:

public class Person
{
    public int Id {get; set;}
    public string Name {get; set;}
    public Place place {get; set;}
}
public class Customer : Person
{
    public int Id {get; set;}
    public string CustomerProperty {get; set;}
}
public class Employee : Person
{
    public int Id {get; set;}
    public string EmployeeProperty {get; set;}
}

因此,我创建了一个方法,使用linq Where子句按房地产、城市或地点进行过滤。

        public static Expression<Func<Customer, bool>> FilterByPlace(string stateId, string cityId, string placeId)
    {
        if (placeId != null)
        {
            return u => u.PlaceId == placeId;
        }
        else if (cityId != null)
        {
            return u => u.Place.Address.cod_city == cityId;
        }
        else if (stateId != null)
        {
            return u => u.Place.Address.City.cod_state == stateId;
        }
        return u => true;
    }

如果我想为Employees这样做,我需要复制并将此<Func<Customer>>更改为<Func<Employee>>。是否有办法使用<T>代替我的实体?

当我更改<Func<Person>>的代码时,它返回错误,因为类型与期望的linq表达式不同。

var custom = db.Customers
                            .Include(item => item.Place)
                            .Include(item => item.Place.Address)
                            .Include(item => item.Place.Address.City)
                            .Include(item => item.Place.Address.City.State)
                            .Where(item => item.Status == (Status)tableStatus)
                            .Where(FilterByPlace(stateId, cityId, placeId))
                            .OrderByDescending(item => item.CustomerId);

谢谢!

Where子句使用表达式<Func<>>和& lt; T>

尝试用Person作为泛型约束创建一个泛型方法。

public static Expression<Func<T, bool>> FilterByPlace<T>(string stateId, string cityId, string placeId) 
   where T : Person
{
    if (placeId != null)
    {
        return u => u.PlaceId == placeId;
    }
    else if (cityId != null)
    {
        return u => u.Place.Address.cod_city == cityId;
    }
    else if (stateId != null)
    {
        return u => u.Place.Address.City.cod_state == stateId;
    }
    return u => true;
}