Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在LINQ查询中使用表达式类_C#_Entity Framework_Linq - Fatal编程技术网

C# 在LINQ查询中使用表达式类

C# 在LINQ查询中使用表达式类,c#,entity-framework,linq,C#,Entity Framework,Linq,我想知道是否有一种方法可以将Expression类用于像这样的LINQ查询的自定义查询 Expression<Func<TEntity, bool>> expression = (x) => x.Id = 1 var items = from item in context.TEntity where expression select item 表达式表达式=(x)=>x.Id=1 var items=来自context.tenty中的项 何处表达 选择项

我想知道是否有一种方法可以将Expression类用于像这样的LINQ查询的自定义查询

Expression<Func<TEntity, bool>> expression = (x) => x.Id = 1

var items = from item in context.TEntity
where expression
select item
表达式表达式=(x)=>x.Id=1
var items=来自context.tenty中的项
何处表达
选择项
我知道有一种方法可以使用LINQ函数作为Where函数,将表达式作为参数,但我确实需要使用LINQ查询来实现这一点

注意:上面的代码只是一个示例,让您了解我试图做的事情,它不是一个实际的工作代码


注2:我需要它来处理实体框架

不幸的是,实体框架本身不支持这种类型的表达式投影,这就是为什么像
where expression.Compile().Invoke(item)这样的常见尝试将在运行时引发异常

但是,如果使用库(使用表达式访问者)并对实体集调用
.AsExpandable()
,则可以动态调用表达式:

Expression<Func<TEntity, bool>> expression = x => x.Id == 1;

var items = from item in context.Set<TEntity>.AsExpandable()
where expression.Invoke(item)
select item;
Expression=x=>x.Id==1;
var items=来自context.Set.AsExpandable()中的项
where expression.Invoke(项)
选择项目;

至少在EF Core上是这样(我刚刚测试过)。手头没有任何EF6项目可以测试

Expression<Func<TEntity, bool>> expression = (x) => x.Id = 1

var items = from item in context.TEntity
where expression.Compile()(item);
select item
表达式表达式=(x)=>x.Id=1
var items=来自context.tenty中的项
其中expression.Compile()(项);
选择项

更新:我刚刚在EF6上做了一个简单的测试项目,但它在那里不起作用,因为它无法识别表达式调用

哎呀,你说得对。该调用是Linqkit中的一个扩展方法,它与AsExpandable一起工作。@DavidL,啊,现在有意义了。谢谢你的更新。@KirillShlenskiy没问题,谢谢你提出来!我真的很惊讶它能在EF Core上工作。。。我必须检查它是否在进行本地过滤(我听说计划支持本地过滤)或者实际上正在转换为SQL,但我现在没有时间这么做。它确实在进行本地过滤。所以他们消除了运行时异常,但如果您想确保在数据库端执行查询,必须打开日志记录并检查每个查询。@IvanStoev是的,这是我的猜测。。。我尝试过启用日志记录,但似乎没有一种一致的方法来实现它,我也没有太多时间来测试它(他们在3个不同的版本中更改了3次,我在github上发现的最后一个方法不适用于已发布的nuget包)@Jcl非常有趣……可惜它不支持正确的投影。然而,看起来他们已经开始了RowNumber的ExpressionVisitor模式。也许他们会将其扩展为多种类型的通用表达式。