Das geht nicht so einfach, denn diese Linq-Syntax wird vom Compiler in die entsprechenden Erweiterungs-Methoden übersetzt. Z.B. select -> Enumerable.Select.
So ganz ist das nicht korrekt. Der Compiler setzt nicht die entsprechenden Erweiterungsmethoden ein. Stattdessen wird einfach ganz stupide eine Texttransformation durchgeführt. Dem Compiler ist dort herzlich egal, ob die Quelle ein IEnumerable, IQueryable oder sonstwas ist; ebensowenig müssen Where/Select/... Erweiterungsmethoden sein.
Beispiel:
var res = from p in src
where p.Price > 100m
group p by p.Category;
wird einfach zu
var res = src
.Where(p => p.Price > 100m)
.GroupBy(p => p.Category);
Dem Compiler ist hierbei egal, was src für einen Datentypen hat. Ebenso können Where und/oder GroupBy auch Instanzmethoden sein. Die einzige Anforderung ist, dass sich der transformierte Code kompilieren lässt.
Am besten mal nach "Bart de Smet, LINQ to Everything" googlen.
Dadurch kann man z.B. folgende Sachen machen:
Foo foo = from a in new Foo("Articles")
where "ArticleNo = 5000"
orderby "ArticleNo"
select "ArticleId,ArticleNo";
string sql = foo.ToString(); // ergibt "SELECT ArticleId,ArticleNo FROM Articles WHERE ArticleNo = 5000 ORDER BY ArticleNo"
Das ganze wird folgendermaßen umgesetzt:
public class Foo
{
private string from;
private string where;
private string orderBy;
private string select;
public Foo(string tableName)
{
this.from = tableName;
}
public Foo Where(Func<Foo,string> bar)
{
this.where = bar(this);
return this;
}
public Foo OrderBy(Func<Foo,string> bar)
{
this.orderBy = bar(this);
return this;
}
public Foo Select(Func<Foo,string> bar)
{
this.select = bar(this);
return this;
}
public override string ToString()
{
return "SELECT "+this.select+" FROM "+this.from+" WHERE "+this.where+" ORDER BY "+this.orderBy;
}
}
Wie man sieht, basiert das weder auf IEnumerable/IQueryable/etc. noch müssen Where/Select/etc. Erweiterungsmethoden sein.