方法不起作用的 EF Core 扩展
EF Core Extension Where Method Not Working
我为我的过滤器查询创建了新的 IQueryable 扩展方法。
在手动添加到我的查询的扩展方法内容中,它正在工作。
但它不适用于 IQueryable 扩展方法。
怎么会这样?
我的扩展 IQueryables:
public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Expression<Func<TSource, bool>> predicate)
{
if (condition)
return source.Where(predicate);
else
return source;
}
public static IQueryable<ProductPrice> GetDynamicWhere(this IQueryable<ProductPrice> source,List<ProductFilterModel> productFilters)
{
Func<string, object> GetValue = (string key) => productFilters.Where(y => y.key == key).Select(x => x.value).FirstOrDefault();
var minPrice = GetValue("min-price");
var maxPrice = GetValue("max-price");
source.Where(x=>x.IsDeleted==false)
.WhereIf(minPrice != null, x => x.ProductVariant.ProductPrices.Where(y => y.IsDeleted == false).Select(y => y.Price).FirstOrDefault() >= Convert.ToInt32(minPrice.ToString()))
.WhereIf(maxPrice != null, x => x.ProductVariant.ProductPrices.Where(y => y.IsDeleted == false).Select(y => y.Price).FirstOrDefault() <= Convert.ToInt32(minPrice.ToString()));
return source;
}
无效,此查询返回了所有数据:
MyDbContext.ProductPrices
//.AsQueryable()
.GetDynamicWhere(filter)
.Include(x => x.ProductVariant.Product)
.Include(x => x.ProductVariant.Variant)
.Include(x => x.ProductVariant.Variant.VariantType)
.ToList();
但这有效(GetDynamicWhere 扩展方法中的相同代码):
MyDbContext.ProductPrices
.Where(x=>x.IsDeleted==false)
.WhereIf(minPrice != null, x => x.ProductVariant.ProductPrices.Where(y => y.IsDeleted == false).Select(y => y.Price).FirstOrDefault() >= Convert.ToInt32(minPrice.ToString()))
.WhereIf(maxPrice != null, x => x.ProductVariant.ProductPrices.Where(y => y.IsDeleted == false).Select(y => y.Price).FirstOrDefault() <= Convert.ToInt32(minPrice.ToString()))
.ToList();
Where 和 WhereIf 子句不会更改源,而是 returning IQueryable。你没有用那个价值做任何事情,它被扔掉了。那么以后,你return原始出处。
相反,您可以这样做:
return source.Where(x=>x.IsDeleted==false)
.WhereIf(minPrice != null, x => x.ProductVariant.ProductPrices.Where(y => y.IsDeleted == false).Select(y => y.Price).FirstOrDefault() >= Convert.ToInt32(minPrice.ToString()))
.WhereIf(maxPrice != null, x => x.ProductVariant.ProductPrices.Where(y => y.IsDeleted == false).Select(y => y.Price).FirstOrDefault() <= Convert.ToInt32(minPrice.ToString()));
我为我的过滤器查询创建了新的 IQueryable 扩展方法。 在手动添加到我的查询的扩展方法内容中,它正在工作。 但它不适用于 IQueryable 扩展方法。 怎么会这样?
我的扩展 IQueryables:
public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Expression<Func<TSource, bool>> predicate)
{
if (condition)
return source.Where(predicate);
else
return source;
}
public static IQueryable<ProductPrice> GetDynamicWhere(this IQueryable<ProductPrice> source,List<ProductFilterModel> productFilters)
{
Func<string, object> GetValue = (string key) => productFilters.Where(y => y.key == key).Select(x => x.value).FirstOrDefault();
var minPrice = GetValue("min-price");
var maxPrice = GetValue("max-price");
source.Where(x=>x.IsDeleted==false)
.WhereIf(minPrice != null, x => x.ProductVariant.ProductPrices.Where(y => y.IsDeleted == false).Select(y => y.Price).FirstOrDefault() >= Convert.ToInt32(minPrice.ToString()))
.WhereIf(maxPrice != null, x => x.ProductVariant.ProductPrices.Where(y => y.IsDeleted == false).Select(y => y.Price).FirstOrDefault() <= Convert.ToInt32(minPrice.ToString()));
return source;
}
无效,此查询返回了所有数据:
MyDbContext.ProductPrices
//.AsQueryable()
.GetDynamicWhere(filter)
.Include(x => x.ProductVariant.Product)
.Include(x => x.ProductVariant.Variant)
.Include(x => x.ProductVariant.Variant.VariantType)
.ToList();
但这有效(GetDynamicWhere 扩展方法中的相同代码):
MyDbContext.ProductPrices
.Where(x=>x.IsDeleted==false)
.WhereIf(minPrice != null, x => x.ProductVariant.ProductPrices.Where(y => y.IsDeleted == false).Select(y => y.Price).FirstOrDefault() >= Convert.ToInt32(minPrice.ToString()))
.WhereIf(maxPrice != null, x => x.ProductVariant.ProductPrices.Where(y => y.IsDeleted == false).Select(y => y.Price).FirstOrDefault() <= Convert.ToInt32(minPrice.ToString()))
.ToList();
Where 和 WhereIf 子句不会更改源,而是 returning IQueryable。你没有用那个价值做任何事情,它被扔掉了。那么以后,你return原始出处。
相反,您可以这样做:
return source.Where(x=>x.IsDeleted==false)
.WhereIf(minPrice != null, x => x.ProductVariant.ProductPrices.Where(y => y.IsDeleted == false).Select(y => y.Price).FirstOrDefault() >= Convert.ToInt32(minPrice.ToString()))
.WhereIf(maxPrice != null, x => x.ProductVariant.ProductPrices.Where(y => y.IsDeleted == false).Select(y => y.Price).FirstOrDefault() <= Convert.ToInt32(minPrice.ToString()));