Do you need to use the CompiledQuery class? Try it...
static Func<DataContext, IQueryable<User>> selectUsers =
(dc) => dc.Users.Select(x => x);
static Func<DataContext, string, IQueryable<User>> filterUserName =
(DataContext dc, string name) =>
selectUsers(dc).Where(user => user.Name == name);
static Func<DataContext, string, int, IQueryable<User>> filterUserAndGroup =
(DataContext dc, string name, int groupId) =>
filterUserName(dc, name).Where(u => u.GroupID == groupId);
... test code (I know that my DataContext is not LINQ2SQL here, but it is LINQ's pleasure and beauty) ...
In addition, I use this method for my own databases, so I know that they are embedded in separate queries that will be sent to the database. I even used regular instance methods that return IQueryable <> instead of Func <> delegates.
public class DataContext
{
public static Func<DataContext, IQueryable<User>> selectUsers =
(dc) => dc.Users.Select(x => x);
public static Func<DataContext, string, IQueryable<User>> filterUserName =
(DataContext dc, string name) =>
selectUsers(dc).Where(user => user.Name == name);
public static Func<DataContext, string, int, IQueryable<User>> UsrAndGrp =
(DataContext dc, string name, int groupId) =>
filterUserName(dc, name).Where(u => u.GroupID == groupId);
public DataContext()
{
Users = new List<User>()
{
new User(){ Name = "Matt", GroupID = 1},
new User(){ Name = "Matt", GroupID = 2},
new User(){ Name = "Jim", GroupID = 2},
new User(){ Name = "Greg", GroupID = 2}
}.AsQueryable();
}
public IQueryable<User> Users { get; set; }
public class User
{
public string Name { get; set; }
public int GroupID { get; set; }
}
}
class Program
{
static void Main(string[] args)
{
var q1 = DataContext.UsrAndGrp(new DataContext(), "Matt", 1);
Console.WriteLine(q1.Count());
var q2 = DataContext.filterUserName(new DataContext(), "Matt");
Console.WriteLine(q2.Count());
}
}