标签: expression-trees

没有翻译的Linq2SQL表达式的解决方案

有没有办法为没有翻译的表达式提供翻译?

像double.parse()

.net c# sql expression-trees linq-to-sql

2
推荐指数
1
解决办法
144
查看次数

NHibernate中的表达树

我有一个有这个签名的方法

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中检索数据.

c# linq nhibernate expression-trees

2
推荐指数
1
解决办法
1072
查看次数

将Expression &lt;Func &lt;FromType &gt;&gt;转换为Expression &lt;Func &lt;ToType &gt;&gt;

如何制作通用的辅助方法,以将Func使用的类型从表达式中的一种类型转换为另一种类型

我有一个Expression<Func<IEmployee, bool>>,我想将其转换为

Expression<Func<Employee, bool>>.
Run Code Online (Sandbox Code Playgroud)

第二个类型始终实现第一个类型。一个通用的解决方案是我要实现的目标。

编辑

我已对问题进行了更清晰的编辑。

.net linq expression-trees

2
推荐指数
1
解决办法
1183
查看次数

使用Linq.Expressions.Expression排序

我写了这个代码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)

.net c# linq sorting expression-trees

2
推荐指数
1
解决办法
5492
查看次数

为实体框架构建嵌套的lambda表达式树多对多关系?

我正在尝试构建一个实体框架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)

.net linq many-to-many entity-framework expression-trees

2
推荐指数
1
解决办法
1996
查看次数

System.ArgumentException:System.Linq.Expressions方法中为lambda声明提供的参数数量不正确

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)

.net c# linq expression-trees linq-to-sql

2
推荐指数
1
解决办法
2691
查看次数

评估表达式<Func <TModel,Object >>中的参数结果

评估代表

我有一个表达式,我使用一个参数,我想在下面的DoSomething函数中使用它的结果.

public void DoSomething <TModel>(Expression<Func<TModel, String>> func){

}
Run Code Online (Sandbox Code Playgroud)

调用DoSomething方法

以下TModelNames属性中有一个名称列表,我想在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)

c# linq asp.net-mvc lambda expression-trees

2
推荐指数
1
解决办法
3134
查看次数

Linq表达式树Any()问题

您好我使用.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)

c# linq expression-trees

2
推荐指数
1
解决办法
941
查看次数

为字符串连接两个对象创建表达式树

我正在学习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.CallString.Concat …

.net c# lambda expression-trees

2
推荐指数
1
解决办法
666
查看次数

具有格式/文化的表达式树ToString

所以这是我想要实现的基础:

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)

c# linq expression expression-trees

2
推荐指数
1
解决办法
157
查看次数