C# の LINQ to SQLite を使って作ったアプリを動かしていると、
SQLite warning (284): automatic index on sqlite_sq_C473B20(program_id)
という警告が Visual Studio の出力画面に表示された。

program_id 列に自動的にインデックスを張ったよ、という警告だが、手動で program_id にインデックスを張っているにも関わらず警告が出る。というよりテーブル名が sqlite_sq_C473B20 というような名前なので、何らかの一時テーブルっぽい。

ネットを探してもこれという解決策が見つからなかったが、LINQ で左外部結合(LEFT OUTER JOIN)をしているのが悪さをしているのかもしれない。

LINQ to SQLite で左外部結合をする際は、
var aQueryResult =
from s in aTableSong
from p in aTableProgram.Where(x => x.Id == s.ProgramId).DefaultIfEmpty()
where s.Name == "hoge"
select new
{
s,
p
};
もしくは
var aQueryResult =
from s in aTableSong
join pp in aTableProgram on s.ProgramId equals pp.Id into gj
from p in gj.DefaultIfEmpty()
where s.Name == "hoge"
select new
{
s,
p
};
のように記述しているが、LINQ を使わずに
oCmd.CommandText = "SELECT * FROM t_song LEFT OUTER JOIN t_program ON t_song.program_id = t_program.program_id"
+ " WHERE t_song.song_name = 'hoge'";
のような古来の記述にして ExecuteReader() したところ、警告が出なくなった。

自動でインデックスを張る作業が重いのか、警告メッセージを表示する作業が重いのか、修正前のコードは実行速度もすこぶる遅い。

該当部分だけできちんと測定したわけではないが、全体の実行処理速度は、修正前で 6 分かかっていたものが、修正後は数秒で完了するようになった。

ひとまずは解決したが、できれば LINQ で記述したい……。

LINQ での解決策をご存じの方がいらっしゃいましたらご教示下さい。