如果您对c#–DynamicFunc,IOrderedQueryable>Expression感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于c#–DynamicFunc,I
如果您对c# – Dynamic Func,IOrderedQueryable> Expression感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于c# – Dynamic Func,IOrderedQueryable> Expression的详细内容,并且为您提供关于"One or more types required to compile a dynamic expression cannot be found. Are you missing...、AS 报错 Program type already present: permissions.dispatcher.GrantableRequest、c# – System.Linq.Expressions.Expression for .OrderBy函数、c# – 如何从Property Name创建Expression> expression的有价值信息。
本文目录一览:- c# – Dynamic Func,IOrderedQueryable> Expression
- "One or more types required to compile a dynamic expression cannot be found. Are you missing...
- AS 报错 Program type already present: permissions.dispatcher.GrantableRequest
- c# – System.Linq.Expressions.Expression for .OrderBy函数
- c# – 如何从Property Name创建Expression> expression
c# – Dynamic Func,IOrderedQueryable> Expression
http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application
我正在使用下面的方法来查询EF
public virtual IEnumerable<TEntity> Get( Expression<Func<TEntity,bool>> filter = null,Func<IQueryable<TEntity>,IOrderedQueryable<TEntity>> orderBy = null,string includeProperties = "") { IQueryable<TEntity> query = dbSet; if (filter != null) { query = query.Where(filter); } foreach (var includeProperty in includeProperties.Split (new char[] { ',' },StringSplitOptions.RemoveEmptyEntries)) { query = query.Include(includeProperty); } if (orderBy != null) { return orderBy(query).ToList(); } else { return query.ToList(); } }
现在我想创建动态Func< IQueryable< TEntity>,IOrderedQueryable< TEntity>>表达式来订购我的数据.
我只知道字段名称为字符串和顺序类型(升序,降序)为字符串(asc,desc)
解决方法
public static Func<IQueryable<TEntity>,IOrderedQueryable<TEntity>> GetorderBy(string orderColumn,string orderType) { Type typeQueryable = typeof(IQueryable<TEntity>); ParameterExpression argQueryable = Expression.Parameter(typeQueryable,"p"); var outerExpression = Expression.Lambda(argQueryable,argQueryable); string[] props = orderColumn.Split('.'); IQueryable<TEntity> query = new List<TEntity>().AsQueryable<TEntity>(); Type type = typeof(TEntity); ParameterExpression arg = Expression.Parameter(type,"x"); Expression expr = arg; foreach(string prop in props) { PropertyInfo pi = type.GetProperty(prop,BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance); expr = Expression.Property(expr,pi); type = pi.PropertyType; } LambdaExpression lambda = Expression.Lambda(expr,arg); string methodName = orderType == "asc" ? "OrderBy" : "OrderByDescending"; MethodCallExpression resultExp = Expression.Call(typeof(Queryable),methodName,new Type[] { typeof(TEntity),type },outerExpression.Body,Expression.Quote(lambda)); var finalLambda = Expression.Lambda(resultExp,argQueryable); return (Func<IQueryable<TEntity>,IOrderedQueryable<TEntity>>)finalLambda.Compile(); }
此方法有两个参数,第一个是字段名,另一个是asc或desc.
方法的结果可以直接与IQueryable对象一起使用.
谢谢你的帮助
"One or more types required to compile a dynamic expression cannot be found. Are you missing...
#事故现场:
在一个.net 4.0 的项目中使用 dynamic,示例代码如下:
1 private static void Main(string[] args)
2 {
3 dynamic obj;
4 obj = new { name = "jack" };
5 Console.WriteLine(obj.name);
6 }
在读取 obj.name 时,报错:
One or more types required to compile a dynamic expression cannot be found. Are you missing references to Microsoft.CSharp.dll and System.Core.dll?
#解决方法:
在项目中,添加 Microsoft.CSharp.dll 的引用;
#参考:
https://stackoverflow.com/questions/11725514/one-or-more-types-required-to-compile-a-dynamic-expression-cannot-be-found-are
——————————————————————————————————————————————————
AS 报错 Program type already present: permissions.dispatcher.GrantableRequest
Program type already present: permissions.dispatcher.GrantableRequest
报错,无法打包
c# – System.Linq.Expressions.Expression for .OrderBy函数
您将看到下面的lambda表达式重复4次
x => x.GetValue<string>("City")).ThenByDescending(x => HelperFunctions.strToTZDateTime(x.GetValue<string>("EventStartStr"),x.GetValue<string[]>("EventTimeZone")[0].ToString())
代码示例:
//SORT DATA switch (SortDetails) { case ("Date"): default: if (SortOrder == "ASC") { _allEvents = _allEvents.OrderBy(x => HelperFunctions.strToTZDateTime(x.GetValue<string>("EventStartStr"),x.GetValue<string[]>("EventTimeZone")[0].ToString())); } else { _allEvents = _allEvents.OrderByDescending(x => HelperFunctions.strToTZDateTime(x.GetValue<string>("EventStartStr"),x.GetValue<string[]>("EventTimeZone")[0].ToString())); } break; case ("Location"): if (SortOrder == "ASC") { _allEvents = _allEvents.OrderBy(x => x.GetValue<string>("Country")).ThenBy(x => x.GetValue<string>("ProvinceState")).ThenBy(x => x.GetValue<string>("City")).ThenBy(x => HelperFunctions.strToTZDateTime(x.GetValue<string>("EventStartStr"),x.GetValue<string[]>("EventTimeZone")[0].ToString())); } else { _allEvents = _allEvents.OrderByDescending(x => x.GetValue<string>("Country")).ThenByDescending(x => x.GetValue<string>("ProvinceState")).ThenByDescending(x => x.GetValue<string>("City")).ThenByDescending(x => HelperFunctions.strToTZDateTime(x.GetValue<string>("EventStartStr"),x.GetValue<string[]>("EventTimeZone")[0].ToString())); } break; }
我想采取第一行,并使其成为我可以进入OrderBy的东西.
就像是 :
System.Linq.Expressions.Expression<Func<DynamicContent,DateTime>> sortLambda = x => HelperFunctions.strToTZDateTime(x.GetValue<string>("EventStartStr"),x.GetValue<string[]>("EventTimeZone")[0].ToString());
进入:
allEvents = _allEvents.OrderBy(sortLambda);
不幸的是,这似乎并没有奏效.
解决方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Expressions; internal class BoringEvent { public string EventStartStr { get; set; } public string EventTimeZone { get; set; } public string ProvinceState { get; set; } public string City { get; set; } public string Country { get; set; } } internal enum SortedBy { Ascending = 0,Descending } class ExpressionsTest { internal static List<BoringEvent> _allEvents = new List<BoringEvent>(); internal static class HelperFunctions { public static DateTime strToTZDateTime(string startDate,string timeZone) { //I'm too lazy to figure out dates by time zone. //Your function already has the logic,so why bother. //Let's assume the time zone is equal in this test case return DateTime.Parse(startDate); } } internal static void Main() { _allEvents.Add(new BoringEvent { EventStartStr = "12/31/1999",//let's party like it's 1999 - (yawn) I'm stuck at this event :< EventTimeZone = "en-us",City = "Philadelphia",ProvinceState = "Pennsylvania",Country = "United States of America"}); _allEvents.Add(new BoringEvent { EventStartStr = "01/01/1970",EventTimeZone = "en-us",City = "New York",ProvinceState = "New York",Country = "United States of America" }); IEnumerable<BoringEvent> sortedEvents = null; //sort by date Console.WriteLine("Sorting Events by Ascending date..."); Expression<Func<BoringEvent,DateTime>> sortLamba = evt => HelperFunctions.strToTZDateTime(evt.EventStartStr,evt.EventTimeZone); sortedEvents = _allEvents.sortEvents(SortedBy.Ascending,sortLamba); Print(sortedEvents); //sort by country,then state,then city,then date Console.WriteLine("Sorting Events Desc by Country,then ProvinceState,then City,then Date"); Expression<Func<BoringEvent,object>>[] sortLamba2 = new Expression<Func<BoringEvent,object>>[] { evt => evt.Country,evt => evt.ProvinceState,evt => evt.City,evt => HelperFunctions.strToTZDateTime(evt.EventStartStr,evt.EventTimeZone) }; sortedEvents = _allEvents.sortEvents(SortedBy.Descending,sortLamba2); Print(sortedEvents); Console.Read(); } private static void Print(IEnumerable<BoringEvent> events) { for(int i = 0; i < events.Count(); i++) { BoringEvent evt = events.ElementAt(i); Console.WriteLine("Event: {0}",i.ToString()); Console.WriteLine("\tEventStartStr: {0}",evt.EventStartStr); Console.WriteLine("\tEventTimeZone: {0}",evt.EventTimeZone); Console.WriteLine("\tCity: {0}",evt.City); Console.WriteLine("\tProvinceState: {0}",evt.ProvinceState); Console.WriteLine("\tCountry: {0}",evt.Country); } } } internal static class EventExtensions { public static IEnumerable<TResult> SortEvents<TResult,T>( this IEnumerable<TResult> events,SortedBy sortByType,params Expression<Func<TResult,T>>[] expressions) { IEnumerable<TResult> retVal = null; switch(sortByType) { case SortedBy.Ascending: retVal = EventExtensions.sortEventsAsc(events,expressions); break; case SortedBy.Descending: retVal = EventExtensions.sortEventsDesc(events,expressions); break; default: throw new InvalidOperationException( string.Format("The SortedBy enumeration does not contain a case for the value of '{0}'.",Enum.GetName(typeof(SortedBy),sortByType))); } return retVal; } public static IEnumerable<TResult> SortEventsAsc<TResult,T>>[] expressions) { IOrderedEnumerable<TResult> sorted = null; for(int i = 0; i < expressions.Count(); i++) { Expression<Func<TResult,T>> exp = (Expression<Func<TResult,T>>)expressions[i]; Func<TResult,T> deleg = exp.Compile(); if(i == 0) { sorted = events.OrderBy(evt => deleg.Invoke(evt)); } else { sorted = sorted.ThenBy(evt => deleg.Invoke(evt)); } } return sorted; } public static IEnumerable<TResult> SortEventsDesc<TResult,T>>[] expressions) { IOrderedEnumerable<TResult> sorted = null; for (int i = 0; i < expressions.Count(); i++) { Expression<Func<TResult,T> deleg = exp.Compile(); if (i == 0) { sorted = events.OrderByDescending(evt => deleg.Invoke(evt)); } else { sorted = sorted.ThenByDescending(evt => deleg.Invoke(evt)); } } return sorted; } }
c# – 如何从Property Name创建Expression> expression
public static MvcHtmlString Control<TModel>(this MyHtmlHelper<TModel> helper,string propertyName,LayoutHelper layout,TemplateType templateType = TemplateType.Screen) { //... }
我想将我的属性名称转换为以下内容
Expression<Func<TModel,string>> expression
任何帮助都感激不尽
解决方法
x => x.PropertyName
从头开始,像这样:
// Get a reference to the property var propertyInfo = ExpressionHelper.GetPropertyInfo<TModel>(propertyName); var model = ExpressionHelper.Parameter<TModel>(); // Build the LINQ expression tree backwards: // x.Prop var key = ExpressionHelper.GetPropertyExpression(model,propertyInfo); // x => x.Prop var keySelector = ExpressionHelper.GetLambda(typeof(TModel),propertyInfo.PropertyType,model,key);
为了使代码更具可读性,将细节表达式树操作移入此辅助类:
public static class ExpressionHelper { private static readonly MethodInfo Lambdamethod = typeof(Expression) .getmethods() .First(x => x.Name == "Lambda" && x.ContainsGenericParameters && x.GetParameters().Length == 2); private static MethodInfo GetLambdaFuncBuilder(Type source,Type dest) { var predicateType = typeof(Func<,>).MakeGenericType(source,dest); return Lambdamethod.MakeGenericmethod(predicateType); } public static PropertyInfo GetPropertyInfo<T>(string name) => typeof(T).GetProperties() .Single(p => p.Name == name); public static ParameterExpression Parameter<T>() => Expression.Parameter(typeof(T)); public static MemberExpression GetPropertyExpression(ParameterExpression obj,PropertyInfo property) => Expression.Property(obj,property); public static LambdaExpression GetLambda<TSource,TDest>(ParameterExpression obj,Expression arg) => GetLambda(typeof(TSource),typeof(TDest),obj,arg); public static LambdaExpression GetLambda(Type source,Type dest,ParameterExpression obj,Expression arg) { var lambdaBuilder = GetLambdaFuncBuilder(source,dest); return (LambdaExpression)lambdaBuilder.Invoke(null,new object[] { arg,new[] { obj } }); } }
从头开始构建表达式树使您在创建lambda表达式时具有最大的灵活性.根据目标属性类型,它可能不总是表达式< Func< TModel,string>> – 最后一种类型可以是int或其他类型.无论目标属性类型如何,此代码都将构建正确的表达式树.
今天关于c# – Dynamic Func,IOrderedQueryable> Expression的讲解已经结束,谢谢您的阅读,如果想了解更多关于"One or more types required to compile a dynamic expression cannot be found. Are you missing...、AS 报错 Program type already present: permissions.dispatcher.GrantableRequest、c# – System.Linq.Expressions.Expression for .OrderBy函数、c# – 如何从Property Name创建Expression> expression的相关知识,请在本站搜索。
本文标签: