如何在 LINQ 表达式树中访问 TPH 类型的属性?



我有2 SQL Server表,OrderOrderDetail。我有3个基于这些表的c#类:Order映射到表Order,而OrderDetailSpecialOrderDetail使用TPH映射到表OrderDetail,OrderDetail是一个抽象基类,具体的SpecialOrderDetail继承自它。

我需要获得所有订单与类型0或有一个SpecialOrderDetail与SpecialType 0。我认为这是可能的:

var orders = database.Order.Where(od => od.Type == 0
|| (od.Detail is SpecialOrderDetail sp && sp.SpecialType == 0)).ToList();

但是Visual Studio给出了这个错误:CS8122: An expression tree may not contain an 'is' pattern-matching operator.

我不能将属性Type从SpecialOrderDetail移动到OrderDetail。我想我可以这样做:

var orders = database.Order.Where(od => od.Type == 0
|| od.Detail is SpecialOrderDetail).ToList();
orders.RemoveAll(od => od.Type != 0
&& od.Detail is SpecialOrderDetail sp && sp.SpecialType != 0);

这样,我必须在2个语句中重复Type检查,这还不错,但将来可能会有更多的检查,并从DB中取出不需要的记录,只是为了立即过滤掉它们。不诉诸实际的SQL语句,是否有一种方法可以将SpecialType检查直接放在DB查询中?

我使用的是。net Framework 4.8和Entity Framework 6.1.3。

表达式树中不支持模式匹配和强制转换,但isas可以工作!我最终使用了这个:

var orders = database.Order.Where(od => od.Type == 0
|| (od.Detail is SpecialOrderDetail
&& (od.Detail as SpecialOrderDetail).SpecialType == 0)).ToList();

最新更新