【发布时间】:2011-08-08 21:24:42
【问题描述】:
我想根据使用其属性的函数的结果过滤我的实体。
即。我得到了这样的实体:
public class Lorem
{
public int A {get;set;}
public int B {get;set;}
public int C {get;set;}
public double DoMath(int externalValue)
{
// real implementation is longer and more complex
if(A==B) {
// some calculations
return 0.2;
}
if(B==C) {
// some calculations
return 0.9;
}
else return 0;
}
}
现在我正在查询实体,我只想获取 DoMath > 0 的实体。
// simplified scenario for example purpose
int someValue = 95;
// working with Entity Framework 4.1 Code First
var filtered = db.Lorems.Where(x=>x.DoMath(someValue) > 0);
我收到此错误:
LINQ to Entities 无法识别方法 -----,并且此方法无法转换为商店表达式。
有可能让它像这样工作吗?
我在自定义 lambda 表达式和使用委托方面的技能很差,所以我想得到一些帮助。
编辑:这是“DoMath”函数的真实代码(没有 cmets,因为它们不是英文的):
public double VypocitejPrislusnost(int value)
{
if (A == B)
{
if (value <= C)
{
return 1;
}
if (value > D)
{
return 0;
}
else
{
double b = D - C;
double tangens = Math.Tan(1 / b);
double a = tangens * (D - value);
return Math.Round(a, 2);
}
}
if (C == D)
{
if (value >= B)
{
return 1;
}
if (value <= A)
{
return 0;
}
else
{
double b = B - A;
double tangens = Math.Tan(1 / b);
double a = tangens * (value - A);
return Math.Round(a, 2);
}
}
else
{
if (value >= B && value <= C)
{
return 1;
}
if (value <= A || value >= D)
{
return 0;
}
if (value > A && value < B)
{
double b = B - A;
double tangens = Math.Tan(1 / b);
double a = tangens * (value - A);
return Math.Round(a, 2);
}
if (value > C && value < D)
{
double b = D - C;
double tangens = Math.Tan(1 / b);
double a = tangens * (D - value);
return Math.Round(a, 2);
}
else
{
return 0;
}
}
}
它基本上是在不同场景下计算三角形中的y坐标。我正在使用它来计算给定值适合模糊集合的程度。
【问题讨论】:
-
您只需要解析该 DoMath 方法,然后缓慢但肯定地得出 A、B、C 和 D 的值,这些值不会产生您正在寻找的值,并将它们排除在您对数据库的 linq 查询,然后将剩余的内容拉入内存(通过使用 AsEnumerable)并通过在第二个 lambda 中实际调用 DoMath 来过滤其余部分
标签: c# entity-framework lambda linq-to-entities