1

// やあみんな

私はアクションでこの呼び出しを行います:

    [HttpGet]
    public virtual ActionResult JsonGetProvinces(int countryId)
    {
        //WebSiteContext WbContext = new WebSiteContext();
        //UnitOfWork UnitofWork = new UnitOfWork(WbContext);

        var provinces =
            (
                from province in unitofWork.ProvinceRepository.All
                where province.CountryId == countryId
                select new
                {
                    Id = province.Id,
                    Name = province.GetType().GetProperty("Name_" + CultureManager.GetCurrentCultureShortName()).GetValue(province)
                }
            ).ToList();

        return Json(provinces, JsonRequestBehavior.AllowGet);
    }

私のクエリに何か問題があります:

        var provinces =
            (
                from province in unitofWork.ProvinceRepository.All
                where province.CountryId == countryId
                select new
                {
                    Id = province.Id,
                    Name = province.GetType().GetProperty("Name_" + CultureManager.GetCurrentCultureShortName()).GetValue(province)
                }
            ).ToList();

特に、 Name = Province.GetType()。GetProperty( "Name_" + CultureManager.GetCurrentCultureShortName())。GetValue(province)

BDDにはName_frName_en列があり、動的に1つを取得しようとしています...それは可能ですか?

もちろん、両方を取得してビューの列を動的に選択することはできますが、その方法を知りたいと思います...

ご協力ありがとうございました

4

2 に答える 2

2

簡単に言うと、コードを少し変更し、内部で式ツリーを使用する必要があります。この質問を見てください

于 2012-12-16T00:50:14.600 に答える
1

EFは関数呼び出しをSQLに変換できません。式ツリーの使用は複雑になる可能性がありますこの質問を参照してください

これは、式ツリーのサンプルです。GetQuery2はGetQueryと同じですが、式ツリーとpropertynameパラメーターがあります。

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

すべての言語文字列をフェッチして、魔法を実行する追加のプロパティ名を作成する方が簡単です。

于 2012-12-16T13:09:09.023 に答える