- PR -

LINQ: 複数キーワード(string配列)に対し LIKE したい

投稿者投稿内容
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2008-10-15 05:17
引用:

yaさんの書き込み (2008-10-12 13:25) より:
Linq to SQL だと仮定していわゆる「えー?」なコード書いてみました。
ワンライナーで書いちゃったけど中身は(一応)難しいことはしていないはず。



このコードで動きました。

勉強不足で理解が追いつかず申し訳ないのですが、
検索対象のフィールドを増やすにはどうすればいいのでしょうか?

P.S.
Link to SQLです。OrElseでOKです。


[ メッセージ編集済み 編集者: Shin 編集日時 2008-10-15 05:35 ]
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2008-10-15 10:25
式木を使わんでも、こんな風にできない?(未検証)
コード:

var query = dc.Contacts.Where(c => c.CompanyName.Contains(keywords[0]));
query = query.Where(c => c.CompanyName.Contains(keywords[1]));
query = query.Where(c => c.CompanyName.Contains(keywords[2]));



------追記
あっ、コレだと and だ。。。
_________________
かるあ のメモスニペット

[ メッセージ編集済み 編集者: かるあ 編集日時 2008-10-15 10:39 ]
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2008-10-15 10:42
Ya さんとほとんど同じだけれど、
coma2n さんのブログで以前こんなエントリがあったのを思い出した
http://d.hatena.ne.jp/coma2n/20080717/1216269202
_________________
かるあ のメモスニペット
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2008-10-15 11:19
一応言っておきますが、理解せずに使うのは危険ですよー。
・columns 指定できるようにしました。
・Like 生成が SelectMany になったのでクエリ式にするために分離しました。
・¥の増殖を直すのがめんどくなったので全角になってます

コード:

var keywords = new[] { "a", "b]", "c%b" };
var  columns = new[] { "CompanyName", "Name" };

var param = Expression.Parameter(typeof(Contacts), "n");

var like_exprs =
	from keyword in keywords
	let pattern = "%" + String.Concat(keyword.Select(c => @"¥" + c).ToArray()) + "%"
	from column in columns
	select (Expression)Expression.Call(
		// SqlMethods.Like(n.[Column], [pattern], '¥¥')
		typeof(SqlMethods).GetMethod(
			"Like",
			new[]{
				typeof(string),
				typeof(string),
				typeof(char)
			}
		),
		// n.[Column]
		Expression.Property(
			param,
			column
		),
		// "[pattern]"
		Expression.Constant(pattern),
		// '¥¥'
		Expression.Constant('¥¥')
	);


var expr  = Expression.Lambda<Func<Contacts, bool>>(
	like_exprs.Aggregate((prev, e) => Expression.OrElse(prev, e)),
	param
);

bindingSource.DataSource = dc.Contacts.Where(expr);



# >>かるあ 氏
# おお、InvokationExpression 使うとよさげなのか。ありがとうございます。
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2008-10-16 06:11
かるあさんの示してくださったリンクの方法、yaさんのコード、どちらもうまく動きました。

.Net 3.5 になって LINQ やら Lambda やら新しいものがなかなか難しいですが、なんとかがんばろうと思います。ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)