有没有办法为没有翻译的表达式提供翻译?
像double.parse()
我有一个有这个签名的方法
public static IList<T> GetBy<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression)
Run Code Online (Sandbox Code Playgroud)
我用来传递lambda表达式并通过从expressiontree中检索数据来在nhibernate中进行搜索限制.
所以当类用户传递类似于:
c => c.fullName == "John" && c.lastName == "Smith" && c.lastName != "" || c.fullName != "" && c.Age > 18
Run Code Online (Sandbox Code Playgroud)
我从表达式树中读取这个结构,这样我就有了一个完整的intellisense方法来提供搜索条件
换句话说:我需要将搜索条件传递给数据访问层(Nhibernate)
所以我需要从表达式树中提取标准,然后通过示例将其传递给n hibernate:
c=>c.fullname = "John"
Run Code Online (Sandbox Code Playgroud)
我将从表达式树中提取以下信息:
propertyname = fullname , value = "John" , restrictiontype = "equality"
Run Code Online (Sandbox Code Playgroud)
然后将此信息传递给nhibernate,如下所示:
ICriteria crit = session.CreateCriteria(typeof(T));
crit.Add(Restrictions.Eq(propretyName, value));
IList<T> list = crit.Add(List<T>())
return list;
Run Code Online (Sandbox Code Playgroud)
无论如何问题是它很难从expressiontree中读取,所以我想知道你们是否有任何简单的方法可能在expressiontree里面迭代来提取数据,或者你们有一些代码可以从ExpressionTree中检索数据.
如何制作通用的辅助方法,以将Func使用的类型从表达式中的一种类型转换为另一种类型
我有一个Expression<Func<IEmployee, bool>>,我想将其转换为
Expression<Func<Employee, bool>>.
Run Code Online (Sandbox Code Playgroud)
第二个类型始终实现第一个类型。一个通用的解决方案是我要实现的目标。
编辑
我已对问题进行了更清晰的编辑。
我写了这个代码IQueryable<T>按列排序sortColumn.我想扩展它,以便列的值BirthDate等于的条目DateTime.Today将排在第一位,但我无法找到或想到如何完成这项工作.
public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string sortColumn, bool asc)
{
var param = Expression.Parameter(typeof(T), "p");
var prop = Expression.Property(param, sortColumn);
var exp = Expression.Lambda(prop, param);
string method = asc ? "OrderBy" : "OrderByDescending";
Type[] types = new[] { q.ElementType, exp.Body.Type };
var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
return q.Provider.CreateQuery<T>(mce);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个实体框架4多对多关系过滤器,这是一个动态数据项目.我知道我需要在运行时构建一个表达式树,而且我很熟悉这样做类似于这样的表达式:
private MethodCallExpression BuiltMethodCall(IQueryable _query, Type _ObjType, string _ColumnToSearch, string _SearchValue)
{
ConstantExpression value = Expression.Constant(_SearchValue);
ParameterExpression _parameter = Expression.Parameter(_ObjType, "value");
MemberExpression _property = Expression.Property(_parameter, _ColumnToSearch);
BinaryExpression comparison = Expression.Equal(_property, value);
LambdaExpression lambda = Expression.Lambda(comparison, _parameter);
//Ex: Customers.Select(c => c).Where(value => (value.City == "Seattle"))
MethodCallExpression _where = Expression.Call(typeof(Queryable), "Where", new Type[] { _query.ElementType }, new Expression[] {
_query.Expression,
Expression.Quote(lambda)
});
return _where;
}
Run Code Online (Sandbox Code Playgroud)
为简单起见,这些示例使用Northwind数据库,其中有多个(Customers < - CustomerCustomerDemo - > CustomerDemographics)的连接.我遇到的问题是在下面的表达式中有嵌套的lambda时构建表达式树,我在这里检索具有特定客户人口统计的所有客户.
string custDemogID = "3";
//Get customers who have a particular …Run Code Online (Sandbox Code Playgroud) Mates,我正在尝试使用System.Linq.Expressions构建表达式树,我收到此错误:
Erro:System.ArgumentException:
1 parameters) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerableSystem.Linq.Expressions.Expression.Lambda [TDelegate](表达式)System.Linq.Expressions.Expression.ValidateLambdaArgs(类型delegateType,Expression&body,ReadOnlyCollection 1参数)中为lambda声明提供的参数数量不正确在System.Linq.Expressions.Expression.Lambda [TDelegate](表达式体,ParameterExpression []参数)的body,Boolean tailCall,IEnumerable`1参数)在C:\ Users \中的Gedi.Controllers.OperacaoController.opBuscaFile(FormCollection表单) Guilherme\Documents\Visual Studio 2012\Projects\Gedi\Gedi\Controllers\OperacaoController.cs:338行
代码:
IQueryable<String> queryableData = AllIndexValues.AsQueryable<string>();
//docTypeId == idTipo
ParameterExpression pe1 = Expression.Parameter(typeof(int), "docTypeId");
Expression right = Expression.Constant(idTipo);
Expression e1 = Expression.Equal(pe1, right);
//idIndice == 16
ParameterExpression pe2 = Expression.Parameter(typeof(int), "idIndice");
right = Expression.Constant(16, typeof(int));
Expression e2 = Expression.Equal(pe2, right);
//docTypeId == idTipo AND idIndice == 16
Expression predicateBody = Expression.And(e1,e2);
//queryableData.Where(docTypeId => (docTypeId == idTipo) AND idIndice …Run Code Online (Sandbox Code Playgroud) 评估代表
我有一个表达式,我使用一个参数,我想在下面的DoSomething函数中使用它的结果.
public void DoSomething <TModel>(Expression<Func<TModel, String>> func){
}
Run Code Online (Sandbox Code Playgroud)
调用DoSomething方法
以下TModel在Names属性中有一个名称列表,我想在DoSomething方法中访问它.我无法弄清楚如何做到这一点.
DoSomething(m => m.Names);
Run Code Online (Sandbox Code Playgroud)
试图编译没有成功
...
func.Compile().Invoke([need m.Names]) in here.
Run Code Online (Sandbox Code Playgroud)
我的现实代码看起来像这样
public static HelperResult TestFor<TModel>(
ExtendedPageBaseClass<TModel> page,
Expression<Func<TModel, object>> valueField,
Expression<Func<TModel, object>> displayField,
Expression<Func<TModel, ICollection>> list,
Object defaultValue = null, String changedEvent = null)
{
var idField = valueField.GetName();
var label = displayField.GetName();
var display = page.Html.NameFor(displayField).ToString();
var data = list.Compile().Invoke(page.Html.ViewData.Model);
return IsolatedSelectorFor(page, idField, display, label, data);
}
Run Code Online (Sandbox Code Playgroud) 您好我使用.Any()扩展方法遇到了表达式树的问题.
这是我的代码:
IQueryable<Book> querableBooks = Books.Values.AsQueryable<Book>();
ParameterExpression pe = Expression.Parameter(typeof(Book), "book");
MemberExpression props = Expression.Property(pe, "properties");
ParameterExpression propList = Expression.Parameter(typeof(List<BookProperty>), "properties");
var _test = Expression.Lambda<Func<List<BookProperty>, bool>>(operation, new ParameterExpression[] { propList });
var _Any = Expression.Call(typeof(Enumerable), "any", new Type[] { typeof(BookProperty) }, new Expression[] { propList });
Expression Lamba = Expression.Lambda(_Any, _props);
Run Code Online (Sandbox Code Playgroud)
_test返回{properties =>((bookProperty.type.key =="lingerie")和(bookProperty.value =="1"))}
_Any返回{properties.Any()}
Lambda返回{book.properties => properties.Any()}
Book类是这样的:
public class Book : IBook
{
public int id { get; set; }
//Removed for clarity
public List<BookProperty> properties { …Run Code Online (Sandbox Code Playgroud) 我正在学习Expression和他们的表达树一起使用它们与IronPython(但现在这无关紧要).
我要做的是,创建一个表达式树,如下面的lambda:
Func<T, int, string> func = (s,t) => s + t;
Run Code Online (Sandbox Code Playgroud)
我目前的功能是这样的:
public static Expression<Func<T, int, string>> StringConcatSelector<T>()
{
var parameterParam = Expression.Parameter(typeof(T), "x");
var paramToString = typeof(T).GetMethods().FirstOrDefault(s=>s.Name=="ToString");
var parameter = Expression.Call(parameterParam, paramToString);
var intParameterParam = Expression.Parameter(typeof(int), "s");
var intParameterToString = typeof(int).GetMethods().FirstOrDefault(s => s.Name == "ToString");
var intParameter = Expression.Call(intParameterParam, intParameterToString);
var stringConcat = typeof(string).GetMethods().FirstOrDefault(s => s.Name == "Concat");
var result = Expression.Call(stringConcat, parameter, intParameter);
return Expression.Lambda<Func<T, int, string>>
(result, parameterParam, intParameterParam);
}
Run Code Online (Sandbox Code Playgroud)
在Expression.Call中String.Concat …
所以这是我想要实现的基础:
string.Format(new CultureInfo("da-DK"), "{0:n}", myDouble)
Run Code Online (Sandbox Code Playgroud)
(用文化格式化数字.示例输入:1,输出:"1,00")
上下文:我需要使用表达式树实现这一点,我当前的代码生成一个搜索查询,通过产品价格,它应该格式化双精度.这是我到目前为止所得到的:
var query = context.Products;
var searchquery = "1,00" //example
var propertyName = "Price"; //example
var parameterExp = Expression.Parameter(typeof(ProductClass), "type");
var propertyExp = Expression.Property(parameterExp, propertyName);
MethodCallExpression propertyExpToStringToLower; //value initialized depending on type.
if (propertyExp.Type == typeof(double))
{
// Example value: 1, needed value: "1,00".
// Here I want to change the double to the correct format, ToString.
}
else
{
//ToString's and ToLower's other attributes (string, int, where no format is needed)
propertyExpToStringToLower = …Run Code Online (Sandbox Code Playgroud) expression-trees ×10
c# ×8
linq ×8
.net ×6
lambda ×2
linq-to-sql ×2
asp.net-mvc ×1
expression ×1
many-to-many ×1
nhibernate ×1
sorting ×1
sql ×1