标签: predicatebuilder

LINQ PredicateBuilder 多个 OR 以 PredicateBuilder.True<> 开头

我有一个这样的实体:

public class Product()
{
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想在Name属性上搜索关键字,以便对它们进行 OR 运算。换句话说,搜索:

勺子刀叉

将在物业中寻找勺子 刀子 叉子Name。我为PredicateBuilderon引入了一种新方法,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)

c# linq filter where-clause predicatebuilder

5
推荐指数
1
解决办法
2916
查看次数

PredicateBuilder 在 C# 中将列表置于列表中

我对 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)

c# linq lambda predicatebuilder

5
推荐指数
1
解决办法
1226
查看次数

使用匿名类型构建表达式

假设我通过 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 …

c# linq linq-to-sql predicatebuilder

5
推荐指数
1
解决办法
1374
查看次数

使用 AND 和 OR 的 C# 谓词构建器

我有以下课程:

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)

c# linq predicatebuilder

5
推荐指数
1
解决办法
3610
查看次数

PredicateBuilder 不适用于 EF Core

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)

任何帮助将不胜感激。非常感谢!

c# predicatebuilder entity-framework-core .net-core

5
推荐指数
1
解决办法
1210
查看次数

如何使用多个嵌套的“ands”和“ors”创建 linq 谓词

我正在尝试使用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”。

linq expression-trees predicatebuilder

4
推荐指数
1
解决办法
2621
查看次数

PredicateBuilder返回零记录

我正在使用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)

任何帮助将不胜感激:)

c# linq predicate where predicatebuilder

4
推荐指数
1
解决办法
777
查看次数

使用PredicateBuilder有一种方法可以从可变长度的字段名称列表中构建谓词吗?

我有一个包含可变数量的字段名称的列表.我想循环遍历此列表并创建一个谓词,过滤所有在该字段中具有值的记录.

foreach (var field in FieldNames)
            {
            myPredicate= myPredicate.And(m => m.*field*!=null );                    
}   
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么做.有什么建议?

TIA

linq entity-framework predicatebuilder

4
推荐指数
1
解决办法
1183
查看次数

PredicateBuilder嵌套OR子句,导致大型谓词的嵌套问题太深

简介:我将PredicateBuilderOr()几个表达式一起使用,然后将该组合表达式发送到OrmLiteSelect()方法.但是,生成的SQL有一个WHERE带有如此多嵌套括号的子句,SQL Server会抛出错误.我该怎么做才能解决这个问题?

细节:我有一个Foo有两列的表,BarBaz.如果我有一组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)

c# predicatebuilder ormlite-servicestack

4
推荐指数
1
解决办法
1075
查看次数

向所有请求EF6添加条件

我的大多数实体(并非全部)都有两个称为CompanyId和的属性Deleted。如何为所有选择请求自动插入这两个属性,而不是对整个应用程序中的每个查询手动进行设置。

例:

db.MyEntity.Where(me => me.Id == 1).Select(me => me.Description)
Run Code Online (Sandbox Code Playgroud)
  • 动态检查实体是否具有道具CompanyIdDeleted
  • 大小写肯定,像这样转换

db.MyEntity.Where(me => me.Id == 1 && Deleted == false && CompanyId == 1).Select(me => me.Description

  • 否定大小写,请保持相同的选择查询。

这将有助于我对所有具有可用属性的查询设置这些条件。

entity-framework dynamicquery predicatebuilder entity-framework-6

4
推荐指数
1
解决办法
760
查看次数