假设我们有接口:
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,因为它不支持延迟执行。我该如何改进它以引入这种支持?