Hatena::ブログ(Diary)

@vvakame の日記

2008-12-20

SQLiteでもLINQしたいんだもん!!

| 16:56 | SQLiteでもLINQしたいんだもん!! - @vvakame の日記 を含むブックマーク

no title

イケるらしい

LINQ provider for Oracle, PostgreSQL, MySQL, Ingres, SQLite, Firebird and ... SQL Server (C# 3.0)

SqlMetalに対応するDbMetalというツールでLINQ to SQLクラスを生成できるようだ

で、

using DbLinq.Data.Linq;

とかやっとくと使えるようだ

でも、サンプルソース見ると、

            // BUG: This one throws a null reference for some reason.
            //Console.Clear();
            //var q3 = from c in db.Customers
            //         from o in c.Orders 
            //        where c.City == "London" select new { c, o };
            //foreach (var v in q3)
            //    ObjectDumper.Write(v);
            //Console.ReadLine();

とか書いてあって結構怖いぞ…

で、サンプルソースを実行してみるとちゃんと動いてて感動した

でも、動作がすごくトロいぞー…

サンプルプログラムがコンソールに動作結果を表示してくれるんだけど

            Console.Clear();
            Console.WriteLine("from p in db.Products orderby p.ProductName select p;");
            var q2 = from p in db.Products orderby p.ProductName select p;
            foreach (var v in q2)
                ObjectDumper.Write(v);
            Console.WriteLine("Press enter to continue.");
            Console.ReadLine();

こんなんが

Select Expression build: 687ms

Select SQL build: 13ms

Select SQL: SELECT CategoryID, Discontinued, ProductID, ProductName, QuantityPer

Unit, ReorderLevel, SupplierID, UnitPrice, UnitsInStock, UnitsOnOrder

FROM main.Products

ORDER BY ProductName

こんなん。流石にちょっと辛い気がする。SqlMetalが生成する物体もこんなに重いんだろうか?

            var compiled = CompiledQuery.Compile((Northwind nor) =>
                from d in nor.Products
                orderby d.ProductName
                select d
                );

軽くできるかしら?

エラー

1

型 'nwind.Northwind' はジェネリック型またはメソッド 'System.Data.Linq.CompiledQuery.Compile<TArg0,TResult>(System.Linq.Expressions.Expression<System.Func<TArg0,TResult>>)' 内で型パラメータ 'TArg0' として使用できません。'nwind.Northwind' から 'System.Data.Linq.DataContext' への暗黙的な参照変換がありません。 D:\CSharp\code\FEZScraper\FEZScraper\lib\DbLinq-0.18\examples\DbLinq.SQLite.Example\Program.cs

140

28

DbLinq.SQLite.Example

Oh...

NorthwindはDbMetalさんが生成したクラス(ぽい)で、

public partial class Northwind : DbLinq.Data.Linq.DataContext

... で ...

public class DataContext : IDisposable

な感じ。ちくしょう!

こりゃSQLiteを生で触って自分で包んでやってLINQ to Objectかなんかで操作するようにしたほうが楽そうだ

2008-12-19

ここがダサいよC#

| 04:23 | ここがダサいよC# - @vvakame の日記 を含むブックマーク

ぐるぐるとくだらないことを考えてたらRubyのMix-in的なものが欲しいなと思ったんだった

C#クックブック 第3版読んでて思ったんだけど

            #region インターフェイスの実装
            #region IDictionary<TKey,TValue> Members

            public ICollection<TValue> Values
            {
                get { return _internalDictionary.Values; }
            }

            public ICollection<TKey> Keys
            {
                get { return _internalDictionary.Keys; }
            }

みたいな記述が多すぎるなと

昨日自分でも、自作クラスにXElementと同じメソッドを作ってやる時に似たようなことをやったというかそういう

O’Reilly Japan - C#クックブック 第3版からサンプルコード落してCSharpRecipesの06_DelegatesEventsLambdaExpressions.cs辺りとか

こんな自明な実装をだらだらと人間サマがやらなきゃいけないとかおかしくない?めんどいです!

RubyのMixinでEnumerableとか取り込むと、eachメソッドを実装するだけでその他のメソッドが動きます!みたいな、あーゆー感じになっていただけるとありがたい

イメージ的に抽象クラスを複数継承したい!っていうのと余り意味的に変わらない気もするなぁ…

どうなると真に嬉しいかちょっと考えてみよう

2008-12-16

VisualStudio C# 2008 Express Editionがやってくれなくとも…

| 02:14 | VisualStudio C# 2008 Express Editionがやってくれなくとも… - @vvakame の日記 を含むブックマーク

SqlMetal.exeがあるじゃないか!!

買っててよかったC#クックブック

で、ぐぐる

コード生成ツール (SqlMetal.exe)

SQL Server Compact Edition 3.5の使い方 - やねうらお−ノーゲーム・ノーライフ

上記情報を参考に、うちの場合

C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin

に埋まってるのを発掘した

さて、使い方は…

input file

SQL Server Express .mdf ファイル、SQL Server Compact 3.5 .sdf ファイル、または .dbml 中間ファイルを指定します。

orz

2008-12-15

LINQって案外ショボい?

| 00:12 | LINQって案外ショボい? - @vvakame の日記 を含むブックマーク

XDocument xdoc = .... ; // 既に何か入っているものとする
Xnamespace xn = "...."; // 適切な何かが入っているものとする

// 以下と同じものを作ってみんとす
// xdoc.XPathSelectElements("//hoge:div[position() mod 6 == 1"); ←ご覧のものはイメージです

// この形式だとこうなる
xdoc.Descendants(xn + "div")
    .Where((el, i) => i % 6 == 1);

// これ書けなくない?
var divs = from div in xdoc.Descendants(xn + "div")
           where .... ? // どう書けばいいものやら…

まぁ上の形式で書けばいいじゃんという話ではあるが下の形式で書きたい

トリッキーじゃない自然なやり方でなんかないもんか

2008-12-08

痒いところに手が届かない

| 01:35 | 痒いところに手が届かない - @vvakame の日記 を含むブックマーク

Hashtableに要素をaddしたときにevent発生させたりできんのかなー?

Hoge.getFuga(1).Hogera.getPoe["fizz"] = "test";

ってしたりしたあと

if(m_poe["hogera"] != "buzz"){
    throw new ArgumentException();
}

みたいなの勝手にやってくれるとか

あとプロパティを動的に定義したいんだけどできないのかな

AssemblyBuilderはDLLやらに一旦吐かないとだめっぽいし

結局俺がRubyが一番困らずかける理由はだいたいのメソッドに引数が1個しかないからだと思うんだ...

しばらく書かないとSchemeのmapの引数の順番さえ忘れるくらいだからなぁ

動的に色々やらせろー使い方忘れるー