void Main()
{
var activeProducts1 = (from p in db.Products
where p.Active && p.Price > 100
select p).ToList();
var activeProducts2 = (from p in GetActiveProducts()
where p.Price > 100
select p).ToList();
var activeProducts3 = (from p in Products
join ap in GetActiveProducts() on p.ProductID equals ap.ProductID
where p.Price > 100 && ap.Price < 200
select p).ToList();
var activeProducts4 = (from p in db.Products
where p.Price > 100
select new {
Product = p,
ActiveProducts = GetActiveProducts()
}).ToList();
}
ObjectQuery<Product> GetActiveProducts()
{
return (from p in db.Products
where p.Active
select p) as ObjectQuery<Product>;
}
|
News:
|
void Main()
{
var prods = GetActiveProducts();
var activeProducts5 = (from p in prods
where p.Price > 100
select p).ToList();
}
|
|
namespace System.Linq
{
/// <summary>
/// LambdaExtenders
/// </summary>
public static class LambdaExtender
{
/// <summary>
/// string based orderby
/// </summary>
/// <typeparam name = "T"></typeparam>
/// <param name = "items"></param>
/// <param name = "property"></param>
/// <param name = "ascending"></param>
/// <returns></returns>
public static IOrderedEnumerable<T> MyOrderBy<T>(this IEnumerable<T> items, string property, bool ascending)
{
try
{
ParameterExpression myObject = Expression.Parameter(typeof (T), "MyObject");
ParameterExpression myEnumeratedObject = Expression.Parameter(typeof (IEnumerable<T>),
"MyEnumeratedObject");
MemberExpression myProperty = Expression.Property(myObject, property);
LambdaExpression myLamda = Expression.Lambda(myProperty, myObject);
MethodCallExpression myMethod = Expression.Call(typeof (Enumerable),
ascending ? "OrderBy" : "OrderByDescending",
new[] {typeof (T), myLamda.Body.Type},
myEnumeratedObject, myLamda);
Func<IEnumerable<T>, IOrderedEnumerable<T>> mySortedLamda =
Expression.Lambda<Func<IEnumerable<T>, IOrderedEnumerable<T>>>(myMethod, myEnumeratedObject).Compile();
return mySortedLamda(items);
}
catch (Exception ex)
{
throw new Exception(string.Concat("MyOrderBy exception\n", ex.Message), ex.InnerException);
}
}
}
}
var dataGridPageSizes = from p in entities.DataGridPageSize select p;
dataGridPageSizes = dataGridPageSizes.MyOrderBy("PageSize", true).AsQueryable();
|
|
|
|
|
|
|
|
|
|
|
So lange wie du denkst dauert das nicht. Du musst nur IQueryable.Execute wie folgt implementieren: Expression mit dem ExpressionVisitor nach InvocationExpression's durchgehen, die Methoden per Reflection ausführen und den Rückgabewert inlinen. Danach die Expression ans EF weiterreichen.
– Marvin Steppat 23.02.2011
|
||
|
Mag sein, dass es nicht wirklich viel ist (wenn man weiss was man tut), aber ich würde da ganz jungfräulich rangehen. In einem laufenden Projekt ist mir das zu heiß, für die privaten Spielereien aber mal eine Überlegung wert.
– Daniel Kuppitz 23.02.2011
|
||
|
Da hast du sicher recht. Ich habe es auch nicht gemacht, weil es nötig war, sondern weil es mir interessant schien ;-)
– Marvin Steppat 23.02.2011
|
|
|