Вам нужно использовать класс CompiledQuery? Попробуйте это ...
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);
... тестовый код (я знаю, что мой DataContext здесь не LINQ2SQL, но в этом и состоит удовольствие и красота LINQ) ...
Кроме того, я использую этот метод в отношении своих собственных баз данных, поэтому я знаю, что они встроены в отдельные запросы для отправки в базу данных. Я даже использовал обычные методы экземпляров, которые возвращают IQueryable <> вместо Func <> делегатов.
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()); // 1
var q2 = DataContext.filterUserName(new DataContext(), "Matt");
Console.WriteLine(q2.Count()); // 2
}
}