我有2 SQL Server表,Order
和OrderDetail
。我有3个基于这些表的c#类:Order
映射到表Order,而OrderDetail
和SpecialOrderDetail
使用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。
表达式树中不支持模式匹配和强制转换,但is
和as
可以工作!我最终使用了这个:
var orders = database.Order.Where(od => od.Type == 0
|| (od.Detail is SpecialOrderDetail
&& (od.Detail as SpecialOrderDetail).SpecialType == 0)).ToList();