using System.Linq.Expressions;
using System.Data.Entity;
using System.Collections.Generic;
public static void Main()
using (var ctx = new zEntityFrameworkContext())
var Abbreviation1 = new Abbreviation() { ID = 1, Description = "A1", RecordStatusID = 1 };
var Abbreviation2 = new Abbreviation() { ID = 2, Description = "A2", RecordStatusID = 2 };
ctx.Abbreviation_XRef.Add(Abbreviation1);
ctx.Abbreviation_XRef.Add(Abbreviation2);
var ContactAbbreviation1 = new ContactAbbreviation() { ID = 1, ContactID = 1, AbbreviationID = 1, RecordStatusID = 1 };
var ContactAbbreviation2 = new ContactAbbreviation() { ID = 2, ContactID = 1, AbbreviationID = 2, RecordStatusID = 1 };
ctx.ContactAbbreviations.Add(ContactAbbreviation1);
ctx.ContactAbbreviations.Add(ContactAbbreviation2);
using (var ctx = new zEntityFrameworkContext())
ContactAbbreviationsFilter caFilter = new ContactAbbreviationsFilter
AbbreviationFilter aFilter = new AbbreviationFilter
Expression<Func<ContactAbbreviation, bool>> subPredicate = x => aFilter.WhereClause().Invoke(x.Abbreviation_XRef);
List<ContactAbbreviation> contactAbbreviations = ctx.ContactAbbreviations
.Include("Abbreviation_XRef")
.Where(subPredicate.Expand())
FiddleHelper.WriteTable(contactAbbreviations);
public interface IBaseTable
int RecordStatusID { get; set; }
public int ID { get; set; }
public int RecordStatusID { get; set; }
public class BaseFilter {
public int? ID { get; set; }
public int? RecordStatusID { get; set; }
public Expression<Func<T, bool>> WhereClause<T>()
where T : class, IBaseTable
int? RecordStatusID = this.RecordStatusID;
ExpressionStarter<T> predicate = PredicateBuilder.New<T>(true);
predicate = predicate.And(x => x.ID == ID);
if (RecordStatusID != null)
predicate = predicate.And(x => x.RecordStatusID == RecordStatusID);
public class ContactAbbreviationsFilter : BaseFilter
public int? ContactID { get; set; }
public int? AbbreviationID { get; set; }
public Expression<Func<ContactAbbreviation, bool>> WhereClause()
int? ContactID = this.ContactID;
int? AbbreviationID = this.AbbreviationID;
ExpressionStarter<ContactAbbreviation> predicate = WhereClause();
predicate = predicate.And(x => x.ContactID == ContactID);
if (AbbreviationID != null)
predicate = predicate.And(x => x.AbbreviationID == AbbreviationID);
public class AbbreviationFilter : BaseFilter
public string Description { get; set; }
public Expression<Func<Abbreviation, bool>> WhereClause()
string Description = this.Description;
ExpressionStarter<Abbreviation> predicate = WhereClause();
if (!string.IsNullOrEmpty(Description))
predicate = predicate.And(x => x.Description == Description);
public class zEntityFrameworkContext : DbContext
public zEntityFrameworkContext() : base(FiddleHelper.GetConnectionStringSqlServer())
public DbSet<ContactAbbreviation> ContactAbbreviations { get; set; }
public DbSet<Abbreviation> Abbreviation_XRef { get; set; }
public class ContactAbbreviation
public int ID { get; set; }
public int ContactID { get; set; }
public int AbbreviationID { get; set; }
public int RecordStatusID { get; set; }
public Abbreviation Abbreviation_XRef { get; set; }
public class Abbreviation
public int ID { get; set; }
public string Description { get; set; }
public int RecordStatusID { get; set; }