今度は何をやらかしてくれるのかと早めのバスに乗ったら問題なく着いてしまいました…
DLINQ(RDB向けのLINQ)では、スキーマからクラスを生成した上で書式的には同じように検索が書けるのですが、ラムダ式の扱いが異なります。
Test db = ...; // Testはスキーマから生成されたクラス var q = from c in db where c.City = "London" select new { c.Name, c.Country };
と書ける訳で、これは
var q = db.Where(c => c.City = "London") .Select(c => new { c.Name, c.Country };
と等価です。しかしこのラムダ式から以下のようなSQLを生成する必要があります。
SELECT Name, Country FROM table WHERE City = 'London'
普通ラムダ式は、Func型になるので、
Func<bool> where = c => c.City = "London";
のようになるのですが、これだと解析してSQLに落とせなくなってしまうので、
ExpressionTree<Func<bool>> where = c => c.City = "London";
のように左辺によって式のままにできるようです。C++のExpression Templateと同じような感じですね。で、後は受け取ったほうがパースするということのようです。
ちなみに、XLINQ(XML用のLINQ)を使うと、
XElement root = new XElement("data", new XAttribute("id", 1), new XElement("item", "fugafuga"), new XElement("item", "hogehoge")); var q = from c root.Descendants("item") where item.Value = "hogehoge" select new XElement("result", c);
のような感じでXMLに対して検索して、結果をXMLとして取り出すこともできるようです。素のLINQやDLINQに比べるとちょっと面倒ですが、DOMでXMLをごにょごにょするのに比べたら遥かに楽ですね。
組み合わせて、配列とRDBをJOINしてXMLを出力するなんてこともできるようです。