我需要构建一个动态过滤器,我想继续使用实体.由于这个原因,我想使用albahari的PredicateBuilder.
我创建了以下代码:
var invoerDatums = PredicateBuilder.True<OnderzoeksVragen>();
var inner = PredicateBuilder.False<OnderzoeksVragen>();
foreach (var filter in set.RapportInvoerFilter.ToList())
{
if(filter.IsDate)
{
var date = DateTime.Parse(filter.Waarde);
invoerDatums = invoerDatums.Or(o => o.Van >= date && o.Tot <= date);
}
else
{
string temp = filter.Waarde;
inner = inner.Or(o => o.OnderzoekType == temp);
}
}
invoerDatums = invoerDatums.And(inner);
var onderzoeksVragen = entities.OnderzoeksVragen
.AsExpandable()
.Where(invoerDatums)
.ToList();
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,只有一个过滤器,它不是日期过滤器.因此只有内部谓词被填充.执行谓词时出现以下错误.
参数"f"未绑定在指定的LINQ to Entities查询表达式中.
在搜索答案时,我找到了以下页面.但这已经在LINQKit中实现了.
是否有其他人遇到此错误并知道如何解决?
Nutshell中的C#有一个名为PredicateBuilder的免费类,它可以在这里逐个构造LINQ谓词.这是该方法的一个摘录,它为谓词添加了一个新表达式.有人可以解释一下吗?(我已经看到了这个问题,我不想要那样的一般性答案.我正在寻找Expression.Invoke和Expression.Lambda如何构建新表达式的具体解释).
public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Xcode 4,我找不到使用图形谓词构建器的方法.它还在吗?我该如何使用它?这方面的文件在哪里?
谢谢
首先,这个问题与使用核心数据的Xcode 4中的Graphical Predicate Builder密切相关.但是,我还没有足够高的评价来发表评论,而且由于我没有回答,我会问一个更具体细节的新问题.
我一直在这里撞墙,所以我要提供尽可能多的细节......
问题:Apple Core Data文档仍在引用Xcode 3,并为Fetched Properties和Fetch Request Templates 显示了一个高度复杂的图形谓词构建器.这包括以图形方式创建任意复杂度的复合谓词的能力,例如:
这显然是一个非常强大的工具,可以有效地使用Core Data,而且就我和其他人所知,这个功能要么丢失,要么被Xcode 4隐藏起来.
现在,基于上面链接的SO问题,我们至少知道在XCode 4中是否添加了获取请求:
随后,您可以在右侧窗格中访问一个非常基本的图形谓词编辑器:
但是这个图形编辑器没有提供苹果文档中指出的复杂复杂性(显然仍然与XCode 3相关).而且,正如另一个SO问题中所提到的,这仍然没有回答如何访问Fetched Properties的任何类型的图形谓词构建器的问题.
据我所知,如果你添加一个Fetched Property,它会出现在你的Core Data编辑器中,但无法访问谓词构建器.扩大:
在Xcode 3中,详细信息窗格提供了一个"编辑谓词"按钮,用于打开Predicate Builder:
以下是XCode 4中的可比较视图:
可以看出,没有"编辑谓词"按钮.
问题:
1)XCode 4中的所有这些功能在哪里?如上所示,到目前为止我唯一接近Predicate Builder的东西就是非常简单的Fetch Request编辑器,它没有提供我能够找到的复合/复杂谓词能力.
而且,我想在这里明确一点:除非我遗漏了一些明显的东西,否则当你创建一个获取请求时出现在XC4中的这个简单的FetchRequest编辑器不是这个问题的答案.它给你的唯一条件选项是选择以下[无/全部/任何]是否为真.这甚至没有接近XCode 3的Predicate Builder的功能,具有复杂的关系和可选的变量等.
2)同样的问题,也是特别针对Fetched Properties.
我的假设是Apple不仅仅删除了在XCode 4中以图形方式创建复杂复合谓词的功能,包括Fetched Properties和Fetch Request Templates.但是我在绳子的尽头想弄清楚它藏在哪里......
提前致谢.
我有代码:
var predicate = PredicateBuilder.True<Value>();
predicate = predicate.And(x => x.value1 == "1");
predicate = predicate.And(x => x.value2 == "2");
var vals = Value.AsExpandable().Where(predicate).ToList();
Run Code Online (Sandbox Code Playgroud)
如果我有PredicateBuilder.True<Value>()
,它会带回我的期望,但如果我有PredicateBuilder.False<Value>()
,它会带回0记录.有人可以解释这是什么区别,为什么在一个场景中我得到0记录在另一个我得到我期望的.我已经阅读了PredicateBuilder
这份文件,但有点令人困惑.我觉得这与我Anding
在一起的谓词有关吗?
您好我想使用谓词表达式基于搜索字符串创建列表.
我有一个类型产品列表包含不同的名称.
List<products> list1 = new List<products>();
list1.Add(new products("sowmya"));
list1.Add(new products("Jane"));
list1.Add(new products("John"));
list1.Add(new products("kumar"));
list1.Add(new products("ramya"));
listBox1.ItemsSource = list1;
Run Code Online (Sandbox Code Playgroud)
现在我想根据用户输入过滤内容.用户将输入n个字符串,并带有'+'作为分隔符.收到字符串后,我会将它们传递给谓词对象
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
List<products> list2 = new List<products>();
Expression<Func<products, bool>> predicate = PredicateBuilder.True<products>();
if (e.Key == Key.Enter)
{
string Searchstring = textBox1.Text.ToString().Trim();
string[] separator = new string[] { "+" };
string[] SearchItems=Searchstring.Split(separator,StringSplitOptions.None);
foreach (string str in SearchItems)
{
string temp = str;
predicate =p => p.Name.Contains(temp.ToLower());
}
list2 = list1.AsQueryable().Where(predicate).ToList();
listBox1.ItemsSource = list2;
}
} …
Run Code Online (Sandbox Code Playgroud) 我在这里使用PredicateBuilder http://www.albahari.com/nutshell/predicatebuilder.aspx,一切都很好,现在我可以生成动态LINQ到SQL表达式,但我不明白的是为什么当我在这样的循环上:
var inner = PredicateBuilder.False<MyType>();
foreach (var f in Filtermodel.InstrumentsFilterList.Where(s => s.isActive))
{
int temp = f.InstrumentID;
inner = inner.Or(ud => ud.InstrumentId == temp);
}
Run Code Online (Sandbox Code Playgroud)
为什么我必须使用那个临时变量?,我尝试使用"f"迭代器变量,但它只获取列表中每个迭代的最后一个值,就像它通过引用传递一样...
我有sitecore pages/lucene文档,包含以下字段:
我正在创建搜索这些并具有以下要求:
这是我得到的:
public static Expression<Func<T, bool>> GetSearchTermPredicate<T>(string searchTerm)
where T : ISearchableItem
{
var actualPhrasePredicate = PredicateBuilder.True<T>()
.Or(r => r.Title.Contains(searchTerm).Boost(2f))
.Or(r => r.FileName.Contains(searchTerm).Boost(1.5f))
.Or(r => r.Content.Contains(searchTerm))
.Or(r => r.DocumentContents.Contains(searchTerm));
var individualWordsPredicate = PredicateBuilder.False<T>();
foreach …
Run Code Online (Sandbox Code Playgroud) 我一直在尝试将LINQ表达式重构为一个方法,并且已经遇到了" Internal .NET Framework Data Provider error 1025.
"和" The parameter 'xyz' was not bound in the specified LINQ to Entities query expression.
"异常.
以下是实体模型的相关部分(使用EF 4.2/LINQ to Entities):
public class Place : Entity
{
public string OfficialName { get; protected internal set; }
public virtual ICollection<PlaceName> { get; protected internal set; }
}
public class PlaceName : Entity
{
public string Text { get; protected internal set; }
public string AsciiEquivalent { get; protected internal set; }
public virtual Language …
Run Code Online (Sandbox Code Playgroud) linq-to-entities expression-trees predicatebuilder entity-framework-4 linqkit
我在使用Microsoft App Studio创建的项目中的一个名为Filter.cs的文件中找到了以下代码.虽然我是一名资深的C#程序员,但我缺乏LINQ谓词表达式构建器的经验.我可以告诉它下面的代码是"元逻辑",用于灵活地构建查询,给出包含类型字段信息的过滤谓词列表以及要注入子表达式的一组数据值.我无法弄清楚的是以下语句中的"表达式"变量:
query = query.Where(expression).AsQueryable()"
Run Code Online (Sandbox Code Playgroud)
..将每个字段的表达式连接成一个更复杂的查询表达式,最终在代码的末尾执行以创建ObservableCollection 结果.如果它是" query + = "我可以推断链接动作就像一个事件处理程序字段,但作为一个直接的赋值语句,它让我感到困惑,因为我希望它能替换表达式变量从最后一个循环迭代得到的最后一个值,从而在过程中重置它并丢失其先前的值.这里发生了什么?
public class Filter<T>
{
public static ObservableCollection<T> FilterCollection(
FilterSpecification filter, IEnumerable<T> data)
{
IQueryable<T> query = data.AsQueryable();
foreach (var predicate in filter.Predicates)
{
Func<T, bool> expression;
var predicateAux = predicate;
switch (predicate.Operator)
{
case ColumnOperatorEnum.Contains:
expression = x => predicateAux.GetFieldValue(x).ToLower().Contains(predicateAux.Value.ToString().ToLower());
break;
case ColumnOperatorEnum.StartsWith:
expression = x => predicateAux.GetFieldValue(x).ToLower().StartsWith(predicateAux.Value.ToString().ToLower());
break;
case ColumnOperatorEnum.GreaterThan:
expression = x => String.Compare(predicateAux.GetFieldValue(x).ToLower(), predicateAux.Value.ToString().ToLower(), StringComparison.Ordinal) > 0;
break;
case ColumnOperatorEnum.LessThan:
expression = …
Run Code Online (Sandbox Code Playgroud) predicatebuilder ×10
c# ×5
linq ×4
.net ×2
core-data ×2
linqkit ×2
xcode4 ×2
ienumerable ×1
ios ×1
linq-to-sql ×1
list ×1
lucene ×1
lucene.net ×1
sitecore ×1
sitecore8 ×1