- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在使用LinqKit创建通用查询相当长一段时间。
一直困扰我的一件事是,您总是必须测试过滤器中发送的值是否有效。
例如:假设我有一个字符串过滤器。条件可以是 Equal、StartsWith、EndsWith 和 Contains。
我的方法看起来像这样:
public List<MyModel> Get(MyModelFilter filter)
{
if (string.IsNullOrEmpty(filter.prop))
{
predicate = predicate.And(_myModel => myModel.Prop.Contains(filter.prop));
}
// Plus a giant amount of if's with multiple filters
return DbSet.AsExpandable()
.Where(predicate)
.ToList();
}
为了结束这堆 If,我决定创建一个通用方法来将过滤器应用于属性。我的想法是传递将应用过滤器的属性和过滤器定义,并封装表达式创建逻辑
这将是以下类型:
public List<MyModel> Get(MyModelFilter filter)
{
predicate = predicate.And(_myModel => myModel.Prop, filter.PropFilterDefinition);
// Goodnye If's, Only others filter impl
return DbSet.AsExpandable()
.Where(predicate)
.ToList();
}
为此,我创建了一些扩展方法来处理此问题
public static Expression<Func<TPredicate, bool>> And<TPredicate>(
this ExpressionStarter<TPredicate> predicate,
Func<TPredicate, string> property, StringFilterDefinition filter,
bool ignoreNull = true)
{
if (InvalidStringFilter(filter, ignoreNull))
{
return predicate;
}
// This is LinqKit's And Extension Method
return predicate.And(BuildPredicate(property, filter));
}
private static Expression<Func<TPredicate, bool>> BuildPredicate<TPredicate>(
Func<TPredicate, string> property,
StringFilterDefinition filter)
{
if (filter.Filter == StringFilterComparators.Equal)
{
return x => property.Invoke(x) == filter.Value;
}
if (filter.Filter == StringFilterComparators.BeginsWith)
{
return x => property.Invoke(x).StartsWith(filter.Value);
}
if (filter.Filter == StringFilterComparators.EndsWith)
{
return x => property.Invoke(x).EndsWith(filter.Value);
}
return x => property.Invoke(x).Contains(filter.Value);
}
private static bool InvalidStringFilter(
StringFilterDefinition filter,
bool ignoreNullValue = true)
{
if (filter?.Filter == null)
{
return true;
}
return ignoreNullValue && string.IsNullOrEmpty(filter.Value);
}
问题是没有应用过滤器,答案就在上面的 Invoke 中。 EF 无法将上述表达式翻译为 SQL。EF 错误为
Microsoft.EntityFrameworkCore.Query.Internal.SqlServerQueryCompilationContextFactory[8] The LINQ expression '(__property_0.Invoke([x]) == __filter_Value_1)' could not be translated and will be evaluated locally. To configure this warning use the DbContextOptionsBuilder.ConfigureWarnings API (event id 'RelationalEventId.QueryClientEvaluationWarning'). ConfigureWarnings can be used when overriding the DbContext.OnConfiguring method or using AddDbContext on the application service provider.
问题是:
我怎样才能让这个建筑工作?另外,关于如何最好地这样做有什么建议吗?
最佳答案
你似乎忘记了除了 PredicateBuilder
,LINQKit 提供的真正有用的功能 AsExpandable
, Expand
和Invoke
自定义扩展方法是为了能够在表达式树中正确嵌入表达式。
为了利用该功能,您应该使用 Expression<Func<...>>
而不是Func<...>
。在发布的代码中,替换所有出现的 Func<TPredicate, string>
与 Expression<Func<TPredicate, string>>
并且问题应该得到解决。
关于c# - Linqkit 中使用 PredicateBuilder 进行通用查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43503236/
我正在使用 PredicateBuilder 在我的操作中创建一个搜索/过滤器部分。在这里: [HttpPost] public ActionResult Test(int? cty,
我有代码: var predicate = PredicateBuilder.True(); predicate = predicate.And(x => x.value1 == "1"); p
我有这样一个实体: public class Product() { public string Name { get; set; } } 我想在 Name 属性上执行关键字搜索,以便对它们进
在我见过的谓词生成器的所有示例中,如果您要构建“和”表达式条件,它会显示一个带有 PredicateBuilder.True 的起始表达式,而 PredicateBuilder.False 如果您正在
我想在 Linq 语句中的 Join 中动态生成跨越多个表的谓词。在以下代码片段中,我想使用 PredicateBuilder 或类似的构造来替换以下代码中的“where”语句: 代替: public
List Prs = data.Products .Where(x=> x.ProductColors
我浏览了 PredicateBuilder来源及其实现让我很好奇。让我们看看 Or 方法的实现: public static Expression> Or (this Expression> expr
我正在为我的应用程序创建一个临时报告功能。我将 PredicateBuilder 用于“Where”部分,但现在当我尝试在“Select”部分中使用它时,我无法成功。 代码示例: IQuerya
我想使用“条件”对象动态构建 LinqToSQL 和 EntityFramework 查询子句,并在必要时利用 C# In a Nutshell PredicateBuilder (http://ww
我在使用 PredicateBuilder 将“Or Where”子句动态添加到 LINQ 语句时遇到问题。我将首先解释我要实现的目标。 我有一个倒排索引,用于存储来自一堆链接标题的关键字。我正在使用
我已经下载了 predicate builder并且很难让它与 Entity Framework 一起工作。这是我的代码:v_OrderDetail 是实体 var context = new Ord
我正在使用 PredicateBuilder 创建动态 Where 子句以从 DataTable 查询数据。我有一个字典,其中包含我需要搜索的列名和值。我只是遍历字典,如果键与列名匹配,则将该键和值添
C# in a Nutshell 有一个名为 PredicateBuilder 的免费类,它可以逐个构建 LINQ 谓词 here .这是向谓词添加新表达式的方法的摘录。有人可以解释一下吗? (我已经
我需要了解使用 PredicateBuilder .在几乎每个如何使用它的示例中,它们都显示如下代码: var predicate = PredicateBuilder.True(); if (!st
我有一个包含可变数量字段名称的列表。我想循环遍历此列表并创建一个谓词来过滤在该字段中具有值的所有记录。 foreach (var field in FieldNames) {
我提取了代码库的相关部分来进行说明。我真的被困在一些可能很简单的事情上。 仅供引用,在数据库中,p 和实体1 之间存在一对多关系。 predicate = PredicateBuilder.False
我一直在阅读 Joseph Albahari 关于 C# 4.0 的精彩书籍,我偶然发现了这门课: public static class PredicateBuilder {
我使用 linqToEntities并想添加 OR动态条件。 我知道there is a great library PredicateBuilder by brother Albahari它可以解决
我有一个关于 PredicateBuilder 的问题,我真的希望你能给我一些关于如何解决这个问题的建议。我将尝试对此进行解释。 我有一个案例,人们可以根据关键字搜索产品。每个关键字都属于一个关键字组
鉴于以下示例模型,我需要通过其所有者的属性查询 ITEMS。这是 Entity Framework 集,我想使用 LINQ 来完成。 public class Owner { public
我是一名优秀的程序员,十分优秀!