我有一个这样的实体:
public class Product()
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想在Name
属性上搜索关键字,以便对它们进行 OR 运算。换句话说,搜索:
勺子刀叉
将在物业中寻找勺子 或 刀子 或 叉子Name
。我为PredicateBuilder
on引入了一种新方法,Product
如下所示:
public static Expression<Func<Product, bool>> ContainsKeywords(params string[] keywords)
{
var predicate = PredicateBuilder.True<Product>();
foreach (var keyword in keywords)
{
var temp = keyword;
predicate = predicate.Or(x => x.Name.Contains(temp));
}
return predicate;
}
Run Code Online (Sandbox Code Playgroud)
我在我的 Web 服务方法之一中像这样使用它:
var keywords = Request.QueryString["q"].Split(' ');
var products = Repo.GetAll<Product>(); // get all the products from …
Run Code Online (Sandbox Code Playgroud) 我对 PredicateBuilder 类有疑问。
我有一个像 3 类的。
public class A
{
public int val1 {get;set;}
public int val2 {get;set;}
public List<B> listb {get;set;}
}
public class B
{
public int val3 {get;set;}
public int val4 {get;set;}
public List<C> listc {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我如何在 B 类中搜索 val3 我需要这样的搜索:
var query = PredicateBuilder.True<A>();
query = query.And(x => x.listb.Where(b=> b.val3 == 1);
Run Code Online (Sandbox Code Playgroud) 假设我通过 LINQ 查询创建了一些匿名类型:
var query = from Person in db.People
join Pet in Pets on Person.ID equals Pet.PersonID
join Thingy in Thingies on Person.ID equals Thingy.PersonID
select new {
Person.ID,
PetName = Pet.Name,
Thing = Thingy.Thing,
OtherThing = Thingy.OtherThing
};
Run Code Online (Sandbox Code Playgroud)
现在我想通过动态构建谓词将一些复杂的表达式应用于查询。我对已知类型所做的事情是这样的:
var predicate = PredicateBuilder.False<MyType>();
predicate = predicate.Or(myType => myType.Flag);
if (someCondition) {
var subPredicate = PredicateBuilder.True<MyType>();
subPredicate = subPredicate.And(myType => myType.Thing == someThing);
subPredicate = subPredicate.And(myType => myType.OtherThing == someOtherThing);
predicate = predicate.Or(subPredicate);
}
query = query.Where(predicate);
Run Code Online (Sandbox Code Playgroud)
是否可以对匿名类型做类似的事情?我还没有找到一种使用匿名类型的方法,PredicateBuilder …
我有以下课程:
public class testClass
{
public string name { get; set; }
public int id { get; set; }
public int age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以及以下代码:
var list = new List<testClass>();
list.Add(new testClass { name = "name", id = 1, age = 30 });
list.Add(new testClass { name = "name", id = 2, age = 22 });
list.Add(new testClass { name = "name", id = 3, age = 20 });
list.Add(new testClass { name = "name", id = …
Run Code Online (Sandbox Code Playgroud) public string[] FindAssets2()
{
string[] result;
using (var ctx = new StockContext())
{
var predicate = PredicateBuilder.New<Asset>().Or(asset => asset.Symbol.Contains("TSLA"));
result = ctx.Assets.AsExpandable()
.Where(predicate)
.Select(z => z.Symbol)
.ToArray();
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
只是一段简单的代码。它抛出我
Exception: Unhandled expression type: 'Extension'
LinqKit.ExpressionVisitor.Visit(Expression exp)
LinqKit.ExpressionVisitor.VisitExpressionList(ReadOnlyCollection<Expression> original)
LinqKit.ExpressionVisitor.VisitMethodCall(MethodCallExpression m)
LinqKit.ExpressionVisitor.Visit(Expression exp)
LinqKit.Extensions.Expand(Expression expr)
LinqKit.ExpandableQueryProvider<T>.System.Linq.IQueryProvider.CreateQuery<TElement>(Expression expression)
System.Linq.Queryable.Where<TSource>(IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
Run Code Online (Sandbox Code Playgroud)
下面是我安装的包
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.0-preview.4.20220.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.0-preview.4.20220.10" />
<PackageReference Include="LINQKit.Core" Version="1.1.17" />
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激。非常感谢!
我正在尝试使用http://www.albahari.com/nutshell/predicatebuilder.aspx 中的PredicateBuilder 在运行时动态创建 linq 表达式。
我目前有一个方法,它接受一个标准对象列表,然后将它们解析成多个谓词,就像这篇文章中描述的那样。
所以目前,我的代码支持以下场景:
WHERE
((a == <val1>) AND (b == <val2>) AND (c == <val3>))
OR
((a == <val4>) AND (b == <val2>) AND (c == <val3>))
Run Code Online (Sandbox Code Playgroud)
但我需要它像这样工作:
WHERE
((a == <val1> OR a == <val4>) AND (b == <val2>) AND (c == <val3>))
OR
((a == <val7>) AND (b == <val5>) AND (c == <val6>))
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点,以便我可以将两个“OR”“组合”在一起,以便逻辑正确流动?我不想要“a OR a AND b AND c”,我需要“(a OR a) AND b and C”。
我正在使用PredicateBuilder创建一个动态Where子句来查询DataTable中的数据.我有一个包含我需要搜索的列名和值的字典.我只是迭代字典,如果键匹配列名,则将该键和值添加到谓词.一切似乎工作正常,直到对数据表运行实际查询,我得到零记录:(但如果我用p => p ["年"] =="2010"之类的东西替换动态谓词,我得到记录回来.这是代码:
var objectList = table.AsEnumerable();
Func<DataRow, bool> predicate = GetPredicate(parms, table.Columns);
var list1 = objectList.Where(predicate).ToList();
private static Func<DataRow, bool> GetPredicate(Dictionary <string, string> parms, DataColumnCollection dataColumnCollection)
{
var predicate = PredicateBuilder.False<DataRow>();
foreach (var parm in parms)
{
if (dataColumnCollection.Contains(parm.Key))
{
var copy = parm;
predicate = predicate.And(p => p[copy.Key] == copy.Value);
}
}
return predicate.Compile();
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激:)
我有一个包含可变数量的字段名称的列表.我想循环遍历此列表并创建一个谓词,过滤所有在该字段中具有值的记录.
foreach (var field in FieldNames)
{
myPredicate= myPredicate.And(m => m.*field*!=null );
}
Run Code Online (Sandbox Code Playgroud)
我不知道该怎么做.有什么建议?
TIA
简介:我将PredicateBuilder与Or()
几个表达式一起使用,然后将该组合表达式发送到OrmLite的Select()
方法.但是,生成的SQL有一个WHERE
带有如此多嵌套括号的子句,SQL Server会抛出错误.我该怎么做才能解决这个问题?
细节:我有一个Foo
有两列的表,Bar
和Baz
.如果我有一组Bar/Baz值并且我想找到所有匹配的行,那么我可能(例如)发出以下SQL:
SELECT * FROM Foo WHERE (Bar=1 AND Baz=1) OR (Bar=2 AND Baz=3) OR ...
Run Code Online (Sandbox Code Playgroud)
由于我正在使用OrmLite,我正在使用PredicateBuilder
为我生成where子句:
var predicate = PredicateBuilder.False<Foo>();
foreach (var nextFoo in fooList)
predicate = predicate.Or(foo => nextFoo.Bar == foo.Bar &&
nextFoo.Baz == foo.Baz);
Db.Select(predicate);
Run Code Online (Sandbox Code Playgroud)
如果我在列表中使用3个Foos执行此操作,则生成的SQL看起来像这样(为了简洁而清理,但故意留在一行上以表达观点):
SELECT Bar, Baz FROM Foo WHERE ((((1=0) OR ((1=Bar) AND (1=Baz))) OR ((2=Bar) AND …
Run Code Online (Sandbox Code Playgroud) 我的大多数实体(并非全部)都有两个称为CompanyId
和的属性Deleted
。如何为所有选择请求自动插入这两个属性,而不是对整个应用程序中的每个查询手动进行设置。
例:
db.MyEntity.Where(me => me.Id == 1).Select(me => me.Description)
Run Code Online (Sandbox Code Playgroud)
CompanyId
和Deleted
。db.MyEntity.Where(me => me.Id == 1 && Deleted == false && CompanyId == 1).Select(me => me.Description
)
这将有助于我对所有具有可用属性的查询设置这些条件。
entity-framework dynamicquery predicatebuilder entity-framework-6
predicatebuilder ×10
c# ×7
linq ×7
.net-core ×1
dynamicquery ×1
filter ×1
lambda ×1
linq-to-sql ×1
predicate ×1
where ×1
where-clause ×1