IQueryable <t>中的自定义方法。选择</t>

时间:2014-09-22 13:01:42

标签: c# linq entity-framework linq-to-sql iqueryable

我需要在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语句。但这个想法是一样的 - 它只是返回一个基于对象字段的枚举值。

3 个答案:

答案 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)

不支持您想要做的事情,老实说,不应该将每个自定义C#方法转换为SQL语句。看看:

Using my own method with LINQ to Entities

http://forums.asp.net/t/1858815.aspx?LINQ+to+Entities+does+not+recognize+the+method+exception+when+using+custom+extension+method

答案 2 :(得分:0)

您可以使用AsEnumerable方法从数据库中获取和加载记录,然后使用您想要的任何方法:

query.AsEnumerable().Select(...);