- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我能够完成第一步,这只是允许某人使用表达式来获取我可以与字符串进行比较的属性。
现在我正试图将它提升到一个新的水平,我希望人们能够执行“where”子句,我将代入要比较的值。基本用例是我们的 API 接受一个名为 ?filterBy:AddressState:VA
的查询参数。
我正在尝试创建一些能够将子句一般附加到 IQueryable
的东西。基本上每个 API 都需要创建一个键/表达式
的字典,它将查找属性以比较 filterBy
的右侧,例如VA
.. 这是我目前所拥有的,但它目前因错误而崩溃
我试图让某人定义:
public Dictionary<string, Expression<Func<User, string, bool>>> FILTER_BY = new Dictionary<string, Expression<Func<User, string, bool>>>()
{
{ "addressstate", (x,inputValue) => x.Address.State == inputValue},
};
然后可以在api调用中做:
baseQ = baseQ.FilterBy(filterBy, FILTER_BY);
但这就是我被困的地方。我试图弄清楚如何用字符串替换 inputValue
(在本例中)。
归根结底,我希望能够定义:
(x, inputValue) => x.Address.State == inputValue
我想写一些东西来用一个新的表达式替换上面的内容以传递给 linq to entities
(x) => x.Address.State == "Va"
扩展方法:
public static IQueryable<T> FilterBy<T, CompareMe>(this IQueryable<T> query, string filterBy, Dictionary<string, Expression<Func<T, CompareMe, bool>>> filterExpressions)
{
if (!string.IsNullOrEmpty(filterBy))
{
//parse on ':' throw argument if there is not two.
var split = filterBy.Split(':');
var key = split[0];
var right = string.Join("", split.Skip(1));
var expression =filterExpressions.FirstOrDefault(x=>x.Key == key.ToLower());
if (expression.Key != null)
{
var parameter = Expression.Parameter(typeof(T), expression.Value.Parameters[0].Name);
Expression body = new ReplaceVisitor<string>(expression.Value.Parameters[1], right).Visit(expression.Value.Body);
var lambda = Expression.Lambda<Func<T, bool>>(body, parameter);
return query.Where(lambda);
}
}
}
这是 ReplaceVisitor:
class ReplaceVisitor <CompareMe> : ExpressionVisitor
{
private CompareMe _value;
private ParameterExpression _parameter;
public ReplaceVisitor(ParameterExpression parameter, CompareMe value)
{
_parameter = parameter;
_value = value;
}
protected override Expression VisitParameter(ParameterExpression node)
{
if (node.Name == _parameter.Name)
{
return Expression.Constant(_value);
}
return node;
}
}
我正在对实体使用 linq,所以无论我在那个 where 子句中放入什么,都需要安全地转换为 sql。
我得到的错误:
ExceptionMessage: "The parameter 'x' was not bound in the specified LINQ to Entities query expression.",
最佳答案
所以最终我解决了它。我基本上需要使用 Visitor 将参数替换为常量,然后将 original
参数传递给 Expression.Lambda
。
解决方案是改变:
var parameter = Expression.Parameter(typeof(T), expression.Value.Parameters[0].Name);
Expression body = new ReplaceVisitor<string>(expression.Value.Parameters[1], right).Visit(expression.Value.Body);
var lambda = Expression.Lambda<Func<T, bool>>(body, parameter);
收件人:
Expression body = new ReplaceVisitor<string>(expression.Value.Parameters[1], right).Visit(expression.Value.Body);
var lambda = Expression.Lambda<Func<T, bool>>(body, expression.Value.Parameters[0]);
关于c# - Linq表达式(curry参数)传递给linq to entities,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35484649/
export const postMoviePopular = url = dispatch => { const data = axios.get(url); dispatch(sa
我一直在学习 Haskell 中的柯里化(Currying),现在尝试以柯里化(Currying)形式编写函数的 Haskell 类型签名,其非柯里化(Currying)形式有一个 (x, y) 类型
在许多列表处理语言(以及其他语言)中,它们都有一个名为 curry 的函数,它可以完成一些巧妙的事情。我的问题是为什么他们称之为 curry ?这个名字从何而来?我唯一的猜测是来自世界各国的美味 cu
当前的 curry 函数采用接受 2 个元素的元组的函数,并允许对结果函数进行 curry 或部分应用。 let x = curry (\(x, y) -> x + y) x 1 2 -- 3 是否可
假设我有 library(functional) f = function(x, p) { x^p } f2 = Curry(f, p=2) 有没有办法找出仅给定 f2 的 p 被设置为什么? 最佳答
我试图了解柯里化(Currying)相对于 Scala 中部分应用程序的优势。请考虑以下代码: def sum(f: Int => Int) = (a: Int, b: Int) => f(a)
我有一个函数,我必须包装另一个函数(如果它存在)或替换它(如果它不存在)。这意味着参数的数量会根据情况而变化。 这就是我的意思- 列列表: const myColumns = [ {name:
我不明白为什么在无类型的 lambda 演算中允许以下 beta 减少: (λx.x y) (u v) -> ((u v) y) 具体来说,我无法理解如何传递两个参数 u和 v到单个参数 x在 λx.
Ruby 1.9's built in support of currying支持两种处理带有任意数量参数的过程的方法: my_proc = proc {|*x| x.max } 1) curry 没
根据下面的代码片段,example-func-A 和 example-func-B 之间是否存在任何有意义的区别? #lang racket/base (require (only-in racket
我是 JavaScript 的新手,试图理解 Oreilly JavaScript Cookbook 中有关柯里化(Currying)的教程。 谁能用通俗易懂的语言逐步详细解释这个程序。请务必解释在程
所以我知道你可以: > f = map (+1) > f [1,2,3] [2,3,4] 但是,如果您这样做会怎样: > g = map (+) [1,2,3] > :t g g :: Num a =
我在多篇文章和博客中看到过对柯里化(Currying)函数的引用,但我找不到一个好的解释(或者至少是一个有意义的解释!) 最佳答案 柯里化(Currying)是指将一个接受多个参数的函数分解为一系列函
所以我在我们的教科书中经过一些反复试验和研究后得到了以下功能,我可以想出一个解决方案。 def prodC1(f : Int => Int) : (Int, Int) => Int = { def
我有问题,可以简化为以下示例: let func a b c = printf "%s %s %s" a b c let partial = func "a" let something_that_r
今天开始学习 Scala,我很好奇你是否可以重载一个函数来添加柯里化(Currying),比如: def add(x: Int, y: Int): Int = x + y def add(x: Int
我正在尝试编写柯里化(Currying)函数的策略,包括通用量化函数。 Require Import Coq.Program.Tactics. Definition curry1 := forall
我想以某种方式组合函数。请在伪代码(不是 F#)中考虑这两个函数 F1 = x + y F2 = F1 * 10 // note I did not specify arguments for F1,
在 Perl 6 世界中,currying 是表示部分实例化的通用术语,它也用于 (parametrized) roles 的世界。 . 但是,尚不清楚如何实际使用它: role Zipi[::T]
我想知道是否可以在多参数组函数上使用柯里化(Currying): scala> def sum(a: Int)(b: Int): Int = { a+b } sum: (a: Int)(b: Int)
我是一名优秀的程序员,十分优秀!