ラムダ式による振り分けについて



DynamicQuery[1]を使用した、ラムダ式による振り分けを実装しました。
このテキストではそれについて解説します。

疑問点がある場合は、ソースコード（Dynamic.vb）、またはDynamicExpressionAPI.htmlを参照してください。（英語）

振り分けルール編集画面で「ラムダ式」にチェックを入れた場合、その振り分けルールはラムダ式によるものであると解釈されます。
ラムダ式は、式評価の結果Booleanを返す必要があり、その評価結果がTrueであった場合該当のタブへ振り分けされます。

* 正規表現のチェックは無視されますので、ラムダ式で正規表現を使用する場合はRegexクラスを使用してください。
　例：Regex.Match(ScreenName,"hoge|fuga").Success

* キーワード it でPostClassのオブジェクトを取得でき、そのプロパティにアクセスできます。
　例：it.IsReply == True

* itを省略することも可能です。
　例：IsReply == True

* Booleanのプロパティのみを指定した場合は真偽値との比較を省略できます。
　例：IsReply

* 参照したオブジェクトの下位にあるメソッドを呼び出すことも可能です。
　例：it.Text.Contains("未読")		' String.Containsメソッドを呼び出している

* 使用可能な型は次の通りです。

Object		Boolean		Char		String		SByte		Byte
Int16		UInt16		Int32		UInt32		Int64		UInt64
Decimal     Single		Double		DateTime	TimeSpan	Guid
Regex

* 使用可能な演算子は次の通りです。演算子の優先順位は最も高いものから表記されています。
　また、カテゴリが同一の演算子の優先順位は等しくなります。その場合は左から右となります。

1.プライマリ
		x.m				インスタンスのフィールドまたはプロパティへのアクセス。アクセス先はPublicである必要があります。
		x.m()			インスタンスのメソッド呼び出し
		x[idx]			配列あるいはインデクサによるアクセス。多次元配列はサポートしていません。
		T.m				静的フィールドまたはプロパティへのアクセス。
		T()				変換またはコンストラクタの呼び出し。newは必須ではありません。
		New()			データオブジェクト初期化
		it				PostClassのインスタンス
		iif(x,y,z)		条件式。xがTrueの場合にy、Falseの場合にzを実行します。

2.単項演算子
		-x				否定。サポートしている型はInt32,Int64,Decimal,Single,Double。
		!x				論理否定。Booleanのみで使用可能です。

3.乗除算
		x * y			乗算。サポートしている型はInt32,UInt32,Int64,UInt64,Decimal,Single,Double。
		x / y			除算。サポートしている型はInt32,UInt32,Int64,UInt64,Decimal,Single,Double。
		x % y　または
		x mod y			剰余。サポートしている型はInt32,UInt32,Int64,UInt64,Decimal,Single,Double。

4.加減算
		x + y			加算または文字列の連結。いずれかのオペランドが文字列の場合は文字列連結となります。
						それ以外でサポートしている型はInt32,UInt32,Int64,UInt64,Decimal,Single,Double,
						DateTime,TimeSpan。
		x - y			減算。サポートしている型はInt32,UInt32,Int64,UInt64,Decimal,Single,Double,
						DateTime,TimeSpan。
		x & y			文字列の連結。

5.比較演算子
		x = y または
		x == y			等しい。プリミティブ型でサポートされます。代入はサポートしていません。
		x != y または
		x <> y			等しくない。プリミティブ型でサポートされます。
		x < y			より小さい。Boolean,Object,Guidではサポートされません。
		x > y			より大きい。Boolean,Object,Guidではサポートされません。
		x <= y			より小さいか等しい。 Boolean,Object,Guidではサポートされません。
		x >= y			より大きいか等しい。 Boolean,Object,Guidではサポートされません。

6.論理AND
		x and y または
		x && y または
		x andalso y		論理AND。オペランドは両方ともBooleanでなければなりません。

7.論理OR
		x or y または
		x || y または
		x orelse y		論理OR。オペランドは両方ともBooleanでなければなりません。

8.条件式
		x ? y : z		条件式。xを評価した結果Trueならばyを評価、Falseならばzを評価します。


PostClass構造について

* プログラムのバージョンアップなどに伴い変更される可能性があります。また、推測による内容も含んでいます。
* 内部構造の都合上ラムダ式での振り分けには使えないプロパティも存在します。

Public Class PostClass
	Public NickName As String					' 名前
	Public TextFromApi As String				' API経由で取得した生の本文
	Public ImageUrl As String					' アイコンイメージのURL
	Public ScreenName As String					' スクリーンネーム
	Public CreatedAt As DateTime				' 投稿日時
	Public StatusId As Long						' ステータスID
	Public IsFav As Boolean						' Favしているかどうか
	Public Text As String						' aタグ変換済み本文
	Public IsRead As Boolean					' 既読かどうか
	Public IsReply As Boolean					' Replyかどうか
	Public IsExcludeReply As Boolean			' 除外ルールにより弾かれたReplyかどうか
	Public IsProtect As Boolean					' Protect発言かどうか
	Public IsOWL As Boolean						' 片思いかどうか
	Public IsMark As Boolean					' マークされた発言かどうか
	Public InReplyToUser As String				' Reply先のユーザーのName(APIでのin_reply_to_screen_name)
	Public InReplyTUserId As Long				' Reply先発言の発言者アカウントID(APIでのin_reply_to_user_id)
	Public InReplyToStatusId As Long			' Reply先のステータスID(APIでのin_reply_to_status_id)
	Public Source As String						' 発言のSource htmlタグ除去済み
	Public SourceHtml As String					' 発言のSource APIの返したhtml生データ
	Public InReplyToList As List(Of String)		' 発言中に認識した＠IDのリスト
	Public IsMe As Boolean						' 自分の発言かどうか
	Public IsDm As Boolean						' DMかどうか
	Public UserId As Long						' 発言者のアカウントID
	Public FilterHit As Boolean					' フィルタにヒットしたかどうか
	Public RetweetedBy As String				' 公式RTしたユーザーのName(screen_name)
	Public RelTabName As String					' Recentと別扱いのタブに格納されている場合はそのタブ名称
	Public IsDeleted As Boolean					' 削除された発言かどうか
	Public FavoritedCount As Integer			' Favカウント
End Class

---
[1] http://code.msdn.microsoft.com/vb2010samples
    Copyright © Microsoft Corporation.  All Rights Reserved.
	This code released under the terms of the Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)