在选择LINQ动态属性 [英] LINQ dynamic property in select
问题描述
//大家好
我在做这个动作的呼叫:
i do this call in Action :
[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);
}
什么是错我的查询:
something is wrong with my query :
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();
格外,
命名= province.GetType()的getProperty(名_+ CultureManager.GetCurrentCultureShortName())。的GetValue(省)
在BDD,有 Name_fr
, Name_en
列
而且我想需要一个动态的......这可能吗?
In BDD, there is Name_fr
, Name_en
columns
and i'm trying to take one dynamically... Is it possible ?
当然,我可以采取两种动态选择查看列,但我会知道怎么办...
Of course, i can take both and choose dynamically the column in View but i would to know how do...
感谢您的帮助。
推荐答案
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;
}
这是比较容易的获取所有所有的语言字符串和写入附加属性的名称的,做的魔力。
这篇关于在选择LINQ动态属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!