在 Linq 中将字符串作为查询过滤器发送到对象

Posted

技术标签:

【中文标题】在 Linq 中将字符串作为查询过滤器发送到对象【英文标题】:Send string as Query Filter in Linq to Objects 【发布时间】:2021-08-08 16:27:50 【问题描述】:

我在移动项目 (.net core 3.0) 中使用 sqllite,就像我在使用 EF core (.Net 5) 的 Web 项目中所做的那样,我写了这个:

InsAndOuts = await context._database.Table<Data.InOut>().ToListAsync();
var InsAndOutsQ = InsAndOuts.AsQueryable();

if (filter)
 
    InsAndOutsQ = InsAndOutsQ.Where(args.Filter); //<= This line is the problem

    InsAndOutsQ = InsAndOutsQ.Where(td => td.IsIn == isIn || td.IsIn == !isOut)
        .Where(td => td.Date >= model.StartDate && td.Date <= model.EndDate);


if (sort)

    InsAndOutsQ = InsAndOutsQ.OrderBy(args.OrderBy); //<= this line also get error

这里不需要效率,因为列表不多,错误是:

    Severity    Code    Description Project File    Line    Suppression State
Error   CS1503  Argument 2: cannot convert from 'string' to 'System.Func<MobileBlazorHybrid.Data.InOut, bool>'  MobileBlazorHybrid  C:\...\MobileBlazorHybrid\MobileBlazorHybrid\WebUI\Pages\InOut.razor    343 Active

    Severity    Code    Description Project File    Line    Suppression State
Error   CS0411  The type arguments for method 'Enumerable.OrderBy<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.   MobileBlazorHybrid  C:\...\MobileBlazorHybrid\MobileBlazorHybrid\WebUI\Pages\InOut.razor    351 Active

过滤器和排序是由数据网格动态构建的,它在带有 Ef 核心 5 的 .Net 5 中工作,但在这里我有 sqllite 并且没有 EF 核心,而 .net 是 3.0。 如何解决这个问题?

【问题讨论】:

args.Filterargs.OrderBy 是什么?它们的类型是什么,它们包含什么值? 它们是由数据网格生成的字符串,如下所示: "((Text == null ? \"\" : Text) == null ? \"\" : (Text == null ? \"\" : 文本)).ToLower().Contains(\"sa\".ToLower())" 【参考方案1】:

我添加了包 Microsoft.EntityFrameworkCore.Sqlite 并使用 System.Linq.Dynamic.Core 解决了我的问题。

【讨论】:

以上是关于在 Linq 中将字符串作为查询过滤器发送到对象的主要内容,如果未能解决你的问题,请参考以下文章

Telerik MVC Extensions Grid - 如何让网格过滤器应用于初始 LINQ 查询或传递给 db?

在 Python 中将 Json 对象字符串作为系统日志消息发送

使用 Entity Framework Core 在 LINQ 查询中将字符串转换为 DateTime

如何在 MySQL/MariaDB 中将 LONGTEXT 字段作为 JSON 返回

如何在php rabbitmq中将完整对象作为消息从生产者发送到消费者

在linq中将sql查询转换为linq new