İfadenin bölümleri argüman olarak iletildiğinde nasıl bir ifade ağacı oluşturabilirim?İfadeleri İfade Ağacında Birleştirme
E.g. ne bunlar gibi ifade ağaçlar oluşturmak istiyorsa: ancak dolaylı bunları oluşturarak
IQueryable<LxUser> test1(IQueryable<LxUser> query, string foo, string bar)
{
query=query.Where(x => x.Foo.StartsWith(foo));
return query.Where(x => x.Bar.StartsWith(bar));
}
:
IQueryable<LxUser> test2(IQueryable<LxUser> query, string foo, string bar)
{
query=testAdd(query, x => x.Foo, foo);
return testAdd(query, x => x.Bar, bar);
}
IQueryable<T> testAdd<T>(IQueryable<T> query,
Expression<Func<T, string>> select, string find)
{
// how can I combine the select expression with StartsWith?
return query.Where(x => select(x) .. y => y.StartsWith(find));
}
Sonuç:
örnekleri (pek mantıklı vermemekle birlikte üzgünüm ama bunu basit tutmaya çalışıyorum), işte sonuç (teşekkürler Quartermeister).
FindText ile başlayan veya eşit olan bir dizeyi aramak için Linq-to-Sql ile kullanılabilir.
public static IQueryable<T> WhereLikeOrExact<T>(IQueryable<T> query,
Expression<Func<T, string>> selectField, string findText)
{
Expression<Func<string, bool>> find;
if (string.IsNullOrEmpty(findText) || findText=="*") return query;
if (findText.EndsWith("*"))
find=x => x.StartsWith(findText.Substring(0, findText.Length-1));
else
find=x => x==findText;
var p=Expression.Parameter(typeof(T), null);
var xpr=Expression.Invoke(find, Expression.Invoke(selectField, p));
return query.Where(Expression.Lambda<Func<T, bool>>(xpr, p));
}
ör
var query=context.User;
query=WhereLikeOrExact(query, x => x.FirstName, find.FirstName);
query=WhereLikeOrExact(query, x => x.LastName, find.LastName);
Teşekkürler, ilk cevabım tam olarak aradığım şeydi! – laktak
Burada önemli bir not, LINQ2SQL ve LINQ2Entities ile çalışacak, ancak EF-EF ile hayır, en iyi bilinenler için, 'Expression.Invoke' komutunu uygulayamaz. – nicodemus13