2

假设我们有接口:

public interface ISystemCompany
{
    Guid SystemCompanyId { get; set; }
}

我们也有IQueryable<>类型,它实现了ISystemCompany.

我们有特定的 SystemCompanyId 值:432486bc-95f2-e111-be6e-74de2b99e249

我们要编写函数,按此字段的值过滤 IQueryable。这是这样的功能示例:

public IQueryable FilterByValue(IQueryable listToFilter, Guid valueToFilter)
{
    var parameter = Expression.Parameter(typeof(object)); 
    // item
    var converted = Expression.Convert(parameter, typeof(ISystemCompany)); 
    // (ISystemCompany)item
    var member = Expression.Property(converted, "SystemCompanyId"); 
    // ((ISystemCompany)item).SystemCompanyId
    var comparison = Expression.Equal(member, Expression.Constant(valueToFilter)); 
    // ((ISystemCompany)item).SystemCompanyId == valueToFilter
    var expression = Expression.Lambda<Func<object, bool>>(comparison, new[] { parameter } ); 
    //item => ((ISystemCompany)item).SystemCompanyId == valueToFilter
    return ((IQueryable<object>)listToFilter).Where(expression); 
    // listToFilter.Where(((ISystemCompany)item).SystemCompanyId == valueToFilter)
}

此函数不适用于 Entity Framework,因为它不支持延迟执行。我该如何改进它以引入这种支持?

4

0 回答 0