GVKun编程网logo

c# – Dynamic Func,IOrderedQueryable> Expression

18

如果您对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

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

AS 报错 Program type already present: permissions.dispatcher.GrantableRequest

Program type already present: permissions.dispatcher.GrantableRequest

报错,无法打包

c# – System.Linq.Expressions.Expression for .OrderBy函数

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);

不幸的是,这似乎并没有奏效.

解决方法

这个控制台应用程序应该修复你. sortLamda可以是任何类型,希望能回答有关动态内容的问题.

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

c# – 如何从Property Name创建Expression> expression

我的 Html帮助方法如下所示

public static MvcHtmlString Control<TModel>(this MyHtmlHelper<TModel> helper,string propertyName,LayoutHelper layout,TemplateType templateType = TemplateType.Screen)
{
    //...        
}

我想将我的属性名称转换为以下内容

Expression<Func<TModel,string>> expression

任何帮助都感激不尽

解决方法

看起来你想要调用ModelMetadata.FromLambdaExpression,而不是FromStringExpression.你可以创建一个表达式

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的相关知识,请在本站搜索。

本文标签: