且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在选择LINQ动态属性

更新时间:2023-01-20 20:38:28

EF不能转换函数调用SQL。使用前pression树可以看到这问题

EF can not translate function calls to SQL. Using expression trees can be comlicated see this question

下面是与前pression树木的样本。该GetQuery2相同GetQuery但与前pression树和一个PROPERTYNAME参数

Here is a sample with expression trees. The GetQuery2 is the same as GetQuery but with expression tree and a propertyname parameter.

public static IQueryable<Foo> GetQuery(BlogContext context)
{
    var query = from x in context.BlogEntries
                select new Foo
                {
                    NameX = x.Name   
                };
    return query;
}


public static IQueryable<Foo> GetQuery2(BlogContext context, string propertyName)
{

    ConstructorInfo ci = typeof(Foo).GetConstructor(new Type[0]);
    MethodInfo miFooGetName = typeof(Foo).GetMethod("set_NameX");
    MethodInfo miBlogEntry = typeof(BlogEntry).GetMethod("get_" + propertyName);

    ParameterExpression param = Expression.Parameter(typeof(BlogEntry), "x");

    IQueryable<Foo> result = Queryable.Select<BlogEntry, Foo>(
                                context.BlogEntries,
                                Expression.Lambda<Func<BlogEntry, Foo>>(
                                    Expression.MemberInit(
                                        Expression.New(ci, new Expression[0]),
                                        new MemberBinding[]{
                                            Expression.Bind(miFooGetName, 
                                                            Expression.Property(param,
                                                            miBlogEntry))}
                                    ),
                                    param
                                )
                                );
    return result;
}

这是比较容易的获取所有所有的语言字符串和写入附加属性的名称的,做的魔力。