如何產生這個拉姆達lambda來表達
() => SomeObj.SomeProp
使用Expression.MakeMemberAccess,而這種方法。我知道如何生成SomeObj => SomeObj.SomeProp,但問題是()部分。這是以某種方式轉換爲DisplayClass。
謝謝。
這是調用UvediSortiranje方法的連接。如果我使用UvediSortiranje(「Naziv」)方法.OrderBy(()=> pfA.Naziv)一切都OK!
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;
}
}
似乎是一個非常明確的問題給我。 –