我有一个班级,用户.
用户具有UserId属性.
我有一个看起来像这样的方法:
static IQueryable<User> FilterById(this IQueryable<User> p, Func<int, bool> sel)
{
return p.Where(m => sel(m.UserId));
}
Run Code Online (Sandbox Code Playgroud)
当我调用函数时,不可避免地:
var users = Users.FilterById(m => m > 10);
Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
方法'System.Object DynamicInvoke(System.Object [])'没有支持的SQL转换.
有没有解决这个问题的方法?Expression.KillMeAndMyFamily()的兔子洞可能需要走多远?
为了澄清我为什么这样做:我使用T4模板自动生成一个简单的存储库和一个管道系统.在管道内,而不是写:
new UserPipe().Where(m => m.UserId > 10 && m.UserName.Contains("oo") && m.LastName == "Wee");
Run Code Online (Sandbox Code Playgroud)
我想生成类似的东西:
new UserPipe()
.UserId(m => m > 10)
.UserName(m => m.Contains("oo"))
.LastName("Wee");
Run Code Online (Sandbox Code Playgroud) Danny最初在回答Scott Hanselman最近的帖子时提出了这个问题:
谁可以告诉我这是什么:Func <Customer,bool ="">具有默认值的可选参数?布尔的空字符串?我用Func替换它,并在我的机器中得到不同的结果!一切都运作良好,我得到"where"声明,而不使用Expression!
我知道我也看到了这个Func的疯狂,但我似乎无法在C#4.0中获得这种类型的Func <>或Expression <Func <>>.
出于好奇,在Func中等号的含义是什么意思,如果有的话,并且在C#4.0中已经弃用了这个功能?
[这个问题来自Scott Hanselman的博客:" 每周源代码52 - 你继续使用LINQ,我认为这意味着你认为它意味着什么."]