如何生成这个 lambda
() => SomeObj.SomeProp
使用 Expression.MakeMemberAccess 和这种方法。我知道如何生成 SomeObj => SomeObj.SomeProp,但问题是 () 部分。这以某种方式翻译为 DisplayClass。
谢谢。
这是调用 UvediSortiranje 方法的连接。如果我使用 inestead UvediSortiranje("Naziv") 方法 .OrderBy(() => pfA.Naziv) 一切正常!
Firma fA = null;
PrevodFirme pfA = null;
Jezik jA = null;
return this.Sesija.QueryOver<Firma>(() => fA)
.UvediSortiranje(sortirajPo, fA) //!!!!
.Left.JoinAlias(() => fA.Prevodi, () => pfA)
.UvediSortiranje(sortirajPo, pfA) //!!!!
.Left.JoinAlias(() => pfA.Jezik, () => jA)
.UvediSortiranje(sortirajPo, jA) //!!!!
.Where(Restrictions.Disjunction().Add(Restrictions.On(() => pfA.Id).IsIn(pfr)).Add(Restrictions.On(() => jA.Id).IsIn(jr)))
.Where(() => jA.Id == jezikId)
.Skip(odZapisa)
.Take(brojZapisa)
.List();
UvediSortiranje 的另一种方法是扩展方法:
public static class Ekst
{
public static IQueryOver<TRoot, TSubType> UvediSortiranje<TRoot, TSubType, T>(this IQueryOver<TRoot, TSubType> ovo, string sortirajPo, T klasa) where T : class
{
//provjeri da li sortiraj po zadovoljava konvenciju Objekat.Svojstvo i ako da, splituj ga na to
var niz = sortirajPo.Split('.');
// provjeri da li postoje ova svojstva u ovom objektu i da li se poklapaju imena
if (niz.Length <= 0) return ovo;
if (/*typeof(TSubType).Name == niz[0]*/ typeof(T).Name == niz[0])
{
//var arg = Expression.Constant(null, typeof(TSubType));
//var body = Expression.Convert(Expression.PropertyOrField(arg, niz[1]),
// typeof(object));
//var lambda = Expression.Lambda<Func<object>>(body);
var param = Expression.Constant(klasa, typeof(T));
var key = typeof(T).GetMember(niz[1]).First();
//var rhs = Expression.MakeMemberAccess(Expression.Constant(itemToCompare), key);
var lhs = Expression.MakeMemberAccess(param, key);
//var body = Expression.Equal(lhs, rhs);
var lambda = Expression.Lambda<Func<object>>(
MemberExpression.MakeMemberAccess(param, key)
);
//lambda = (() => Expression.PropertyOrField(arg, niz[1]));
return niz[2].ToLower() == "asc" ? ovo.OrderBy(lambda).Asc : ovo.OrderBy(lambda).Desc;
}
//u suprotnom vrcemo ovo bez ikakvog sortiranja
return ovo;
}
}