是否可以使用LINQ to SQL进行条件投影?假设我有一个名为PersonTable的SQL表。在C#中,我有几个类:
public interface Person
{
int employeeType; //1 is employee, 2 is manager
String name;
}
和两个派生类。为简单起见:
public class Employee : Person {}
public class Manager : Person {}
现在,我想使用LINQ to SQL根据employeeType项目投射到相应的派生类:
IQueryable<IPerson> = PersonTable.Select(x => //x.employeeType == 1 ? new Employee { } : x == 2 {new Manager {} )
这对于这种情况是可以的,但我有一种情况,我试图实例化7种不同的可能的派生类型,所以条件会变得很长很难看。此外,我的真实场景,接口/派生类有15个左右的属性来填充;这也会很快变得很难看。
我的第一次尝试是编写一个返回适当类型的表达式树,但这不起作用,因为我需要知道参数表达式的值才能正确调用Expression.MemberInit。对于像LINQ to SQL这样的大型条件初始化,什么解决方案可能是最好的。
我不能使用表继承,因为我在投影中创建数据传输对象。我也考虑过使用where和union,但是表达式树路径似乎更有趣,因为我有一个位置来维护代码,而不是每次引入新的派生类时 - 如果这是一个偶然的选项。
答案 0 :(得分:1)
也许你可以这样做,
PersonTable.Where(p => p.employeeType == 1)
.Select(p => new Employee { ... })
.Cast<IPerson>()
.Concat(
PersonTable.Where(p => p.employeeType == 2)
.Select(p => new Manager { ... })
.Cast<IPerson>());
你也可以试试,
PersonTable.Select(p =>
p.employeeType == 1 ? (IPerson)(new Employee { ... }) :
p.employeeType == n ? (IPerson)(new Other { ... }) :
(IPerson)(new Manager { ... }));
或者,如果它不需要IQueryable
,
PersonTable.AsEnumerable().Select(p => {
switch(p.employeeType)
{
case 2:
return Manager { ... };
default:
return Employee { ... };
}});