【问题标题】:Linq Evaluating a method as a lambda expressionLinq 将方法评估为 lambda 表达式
【发布时间】:2009-07-22 14:13:29
【问题描述】:

我正在尝试使用 linq 表达式从列表中进行选择,其中范围变量在返回布尔值的静态方法中进行评估。我想选择在使用该方法评估范围变量时返回 true 的范围变量。

var result = from rangeVariable in DataSource
             where (rangeVariable => Foo.MethodReturnsBoolean(rangeVariable) == true)
             select rangeVariable;

我收到此错误:

无法将 Lambda 表达式转换为类型“bool”,因为它不是委托类型。

谁能解释发生了什么,以及我如何实现这一点?

【问题讨论】:

    标签: c# linq lambda


    【解决方案1】:

    您不需要“where”子句中的 lambda 表达式 - 查询表达式翻译会为您完成。只需使用:

    var result = from rangeVariable in DataSource
                 where Foo.MethodReturnsBoolean(rangeVariable) == true
                 select rangeVariable;
    

    然后我会亲自删除“== true”冗余(我知道这只是示例代码,但是...):

    var result = from rangeVariable in DataSource
                 where Foo.MethodReturnsBoolean(rangeVariable)
                 select rangeVariable;
    

    然后我会考虑使用查询表达式实际上是在为您购买什么。如果您只是执行“where”(或仅执行“select”),您可能会发现点符号更简单:

    var result = DataSource.Where(x => Foo.MethodReturnsBoolean(x));
    

    它变得更好了:编译器不需要从 lambda 表达式推断返回值(因为它总是bool),所以你可以只使用方法组转换:

    var result = DataSource.Where(Foo.MethodReturnsBoolean);
    

    清洁度如何? :)

    【讨论】:

    • 当我尝试 var = from rangeVariable in Datacontext.table where me.MethodThatReturnsBoolean(rangeVariable) select rangeVariable 我得到一个 RUNTIME NotSupportedException: Method 'Boolean MethodThatReturnsBoolean(System.String)' has no supported translation to SQL .任何布尔函数都可以放在 where 子句中吗?有什么建议么? stackoverflow.com/questions/8662259/…
    • @akh2103:这取决于您使用的是 LINQ to Objects 还是 LINQ to SQL 等。对于 LINQ to Objects,您可以使用任何您喜欢的委托 - 对于像 LINQ to SQL 这样的翻译提供程序,它必须是提供者知道如何转换的表达式树。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多