Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static ObservableCollection<SI> GetDisplayStratsByJurisd(string jurisd, short Year,
- Expression<Func<string, bool>> lambStat)
- {
- var ctx = new MI_Entities(server, database);
- var strats = from y in ctx.SIset.AsNoTracking()
- where y.Jurisd == jurisd && y.Year_ID == Year && lambStat(y.Status)
- select y;
- return new ObservableCollection<SI>(strats);
- }
- public static ObservableCollection<SI> GetDisplayStratsByJurisd(string jurisd, short Year,
- Expression<Func<string, bool>> lambStat)
- {
- var ctx = new MI_Entities(server, database);
- Func<string, bool> bob = lambStat.Compile();
- var strats = from y in ctx.SIset.AsNoTracking()
- where y.Jurisd == jurisd && y.Year_ID == Year && bob(y.Status)
- select y;
- return new ObservableCollection<SI>(strats);
- }
- // A function that takes two Expression<Func<TSource, bool>> and returns the AND expression
- static Expression<Func<TSource, bool>> AndAlso<TSource> (
- this Expression<Func<TSource, bool>> x,
- Expression<Func<TSource, bool>> y)
- {
- // TODO implement
- }
- Expression<Func<Student, bool>> expr1 = student => student.City == "Birmingham";
- Expression<Func<Student, bool>> expr2 = student => student.Gender == Gender.Male;
- Expression<Func<Student, bool>> exprAND = expr1.AndAlso(expr2);
- var brummyMaleStudents = dbContext.Students.Where(exprAnd).Select(...);
- .Where(student => student.City == "Birmingham" && student.Gender == Gender.Male)
- internal class ReplaceExpressionVisitor : ExpressionVisitor
- {
- private readonly Expression oldValue;
- private readonly Expression newValue;
- public ReplaceExpressionVisitor(ParameterExpression oldValue,
- ParameterExpression newValue)
- {
- this.oldValue = oldValue;
- this.newValue = newValue;
- }
- public override Expression Visit(Expression node)
- {
- if (node == this.oldValue)
- { // "my" expression is visited
- return this.newValue;
- }
- else
- { // not my Expression, I don't know how to Visit it, let the base class handle this
- return base.Visit(node);
- }
- }
- }
- static Expression<Func<TSource, bool>> AndAlso<TSource>(
- this Expression<Func<TSource, bool>> expr1,
- Expression<Func<TSource, bool>> expr2)
- {
- // Create one expression that represent expr1 && expr2
- // the input of expr1 is a TSource,
- // the input of expr2 is a TSource,
- // so the input of expr1 && expr2 is a TSource:
- ParameterExpression inputParameter = Expression.Parameter(typeof(TSource));
- // Visit the left part of the AND:
- var leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters[0], inputParameter)
- var left = leftVisitor.Visit(expr1.Body);
- // Visit the right part of the AND:
- var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter);
- var right = rightVisitor.Visit(expr2.Body);
- // Combine left and right with a binary expression representing left && right:
- var andExpression = Expression.AndAlso(left, right);
- // return the lambda expression that takes one Tsource as input and returns the AND:
- var lambda = Expression.Lambda<Func<TSource, bool>>(andExpression, new[] {parameter});
- return lambda;
- }
- Expression<Func<Student, bool>> expr1 = student => student.City == "Birmingham";
- Expression<Func<Student, bool>> expr2 = student => student.Gender == Gender.Male;
- var brummyMaleStudents = dbContext.Students.Where(expr1.AndAlso(expr2));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement