我需要在IQueryable<T>.Select
语句中运行自定义方法,例如
query.Select(r => new ResultObject()
{
Id = r.Persion.Id,
Code = r.Person.Code,
CalculatedField = CalculateField(r.Person)
}
问题是,我无法像这样运行它,因为抛出了linq-to-sql异常。 CalculateField基本上是一个switch语句:
private static CalcFieldEnum CalculateField(Person p)
{
if(p.Age < 21)
{
if(p.Salary > 2000 && p.YearsWorked > 2)
return CalcFieldEnum.TypeB;
else if(p.YearsWorked <= 2)
return CalcFieldEnum.TypeC;
}
else
{
if(p.Salary > 3000)
return CalcFieldEnum.TypeB;
}
return CalcFieldEnum.TypeA;
}
关于方法(CalculateField)唯一重要的是它只需要一些实体并根据实体的字段值返回结果。
我无法在查询后运行此方法,因为用户可以按列对结果进行排序,并且也可以在IQueryable上运行排序。有什么方法可以解决这个问题吗?
P.S 我简化了方法的逻辑,实际上还有很多更多的if-else语句。但这个想法是一样的 - 它只是返回一个基于对象字段的枚举值。
答案 0 :(得分:2)
如果你可以将方法重写为lambda,例如
p => p.Age < 21
? (
(p.Salary > 2000 && p.YearsWorked > 2)
? CalcFieldEnum.TypeB
: (p.YearsWorked <= 2 ? CalcFieldEnum.TypeC : CalcFieldEnum.TypeA)
)
: ( p.Salary > 3000 ? CalcFieldEnum.TypeB : CalcFieldEnum.TypeA);
然后你应该能够将它传递给数据库。
答案 1 :(得分:1)
答案 2 :(得分:0)
您可以使用AsEnumerable
方法从数据库中获取和加载记录,然后使用您想要的任何方法:
query.AsEnumerable().Select(...);