EF Core和LINQ-如何在运行时使用字符串变量构建动态的Where子句?

OJB1

我已经读过许多关于该问题的变体,我无法相信我需要的解决方案是如此复杂,以至于需要使用额外的库和疯狂的技巧,希望不会!

在运行时,我项目中的LINQ查询需要动态更改,具体取决于用户要过滤的数据库表中的列数。在我的示例中,我首先显示一个有效的LINQ查询,该查询是经过硬编码的。下一个示例使用在运行时生成的列表,我需要弄清楚的是如何在不编译错误的情况下将字符串变量(whereClause)插入LINQ查询中?

工作示例(硬编码)

logs = _context.Logs.Where(s => s.Level == LogLevel & s.LogEventCategory == EventCategory)
               .Select(s => new Logs()
               {
                   TimeStamp = s.TimeStamp,
                   Level = s.Level,
                   Exception = s.Exception,
                   LogEventCategory = s.LogEventCategory,
                   LogEventType = s.LogEventType,
                   LogEventSource = s.LogEventSource,
                   LogEventName = s.LogEventName,
                   LogUserName = s.LogUserName,
                   LogForename = s.LogForename,
                   LogSurname = s.LogSurname,
                   LogData = s.LogData
               });

示例二-我要修复和使用的解决方案...

首先创建一个列表,列表的内容将在每次运行新查询时更改,通过父OnGet方法作为变量传递的字符串将包含一个值并在字符串连接串联中使用,或者为null,因此不会添加到列表中并在串联中使用。

第二个例子是我得到编译错误的地方。

var filtersList = new List<string>();
        if (LogLevel != null)
        {
            filtersList.Add("s.LogLevel == LogLevel");
        }
        if (EventCategory != null)
        {
            filtersList.Add("s.EventCategory == EventCategory");
        }

        var whereClause = string.Join(" & ", filtersList.ToArray());


logs = _context.Logs.Where(s => whereClause) // *HERE I WANT TO USE THE STRING VARIABLE! not working
                   .Select(s => new Logs()
                   {
                       TimeStamp = s.TimeStamp,
                       Level = s.Level,
                       Exception = s.Exception,
                       LogEventCategory = s.LogEventCategory,
                       LogEventType = s.LogEventType,
                       LogEventSource = s.LogEventSource,
                       LogEventName = s.LogEventName,
                       LogUserName = s.LogUserName,
                       LogForename = s.LogForename,
                       LogSurname = s.LogSurname,
                       LogData = s.LogData
                   });

我得到的错误是“无法将lambda表达式转换为预期的委托类型,因为该块中的某些返回类型不能隐式转换为委托的返回类型”等等

米尔尼

在实现之前,您只需将.Where()调用添加到查询的末尾:

query = _context.Logs.Select(s => new ..);

if (EventCategory != null) query = query.Where(e => e.EventCategory == EventCategory);
if (LogLevel != null) query = query.Where(e => e.LogLevel == LogLevel);

var items = query.ToList();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在运行时在EF7 Core中更改连接字符串?

来自分类Dev

在EF LINQ查询中使用字符串方法

来自分类Dev

如何让重载 == 运算符与 LINQ 和 EF Core 一起使用?

来自分类Dev

在 Linq 查询 EF Core 中使用 Like

来自分类Dev

选择使用LINQ和EF过滤

来自分类Dev

使用连接字符串和精简程序时如何在运行时更改初始目录

来自分类Dev

EF Core动态包含和订购

来自分类Dev

EF Core复杂的where子句

来自分类Dev

EF Core 无法翻译简单的 where linq 表达式

来自分类Dev

SQLite EF6在运行时以编程方式设置连接字符串

来自分类Dev

在EF 6中在运行时更改连接字符串

来自分类Dev

EF6在运行时更改连接字符串

来自分类Dev

EF和Linq除外

来自分类Dev

如何在Linq和EF中订购嵌套集合

来自分类Dev

使用 EF Core Code First 和 IdentityUser 的 .Net Core API

来自分类Dev

如何在EF Core中启用运行时脚手架

来自分类Dev

在运行时通过字符串从 python 访问模块和模块变量

来自分类Dev

使用Linq和EF无法更新记录的多个字段

来自分类Dev

使用EF6和LINQ深度加载数据

来自分类Dev

使用linq和EF创建对象而不定义其字段

来自分类Dev

使用Linq和EF无法更新记录的多个字段

来自分类Dev

使用EF和LINQ填充C#/ XAML组合框

来自分类Dev

如何使用GetAsyncEnumerator中止正在运行的EF Core查询?

来自分类Dev

EF Core和Azure

来自分类Dev

在EF Linq to Entities中使用动态linq

来自分类Dev

Xunit - 如何使用 Moq 和 EF Core 作为身份主键

来自分类Dev

如何在运行时首先使用EF代码从ObjectContext获取实体类型的列表?

来自分类Dev

EF-在运行时在Firebird和Oracle数据库之间切换

来自分类Dev

在EF Core中的运行时创建表

Related 相关文章

热门标签

归档