[.NET][LINQ][TroubleShooting] この RPC 要求に指定されたパラメーターが多すぎます。最大数は 2100 です。

社員IDのリストint[] employeeIdsに合致する社員をデータベースから検索する場合、下記のようにEnumerable.Containsを使用したクエリ式を記述する。

var query = from e in context.Employees
            where employeeIds.Contains(e.Id)
            select e;

この式のWHERE条件はLINQ to SQL機能によって、下記のSQLに変換される

  WHERE e.Id IN (要素1, 要素2, …)

この際、employeeIdsの要素数が2,100を超えると下記のような例外が発生するようだ

System.Data.SqlClient.SqlException: 着信の表形式のデータ ストリーム (TDS)
リモート プロシージャ コール (RPC) プロトコル ストリームが不適切です。
この RPC 要求に指定されたパラメーターが多すぎます。最大数は 2100 です。

これを回避するにはemployeeIdsを2000要素ごと(2100未満の数)に分割してクエリを実行して連結すればよい。
やり方はこのポストを参照

[.NET]EventHandlerのnullチェック回避

C#でイベントを発行する側に良く見るコード

if(this.MyEvent != null)
{
    this.MyEvent(this, EventArgs.Empty);
}

nullチェックがウザいので、このようにeventを宣言すればよい。

class Hoge 
{
    public event EventHandler MyEvent = delegate { };
}

ネタ元はこちら

[.NET][C#][LINQ] Collectionをある数ごとに分割する

const int ChunkSize = 3;

int[] numbers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

// 要素のインデックスをChunkSizeで割った商の数でグループ化して、
// グループの数だけ chunkedNumbers の要素ができる。
var chunkedNumbers = numbers
                         .Select((number, index) => new { Index = index, Number = number })
                         .GroupBy(x => x.Index / ChunkSize)
                         .Select(gr => gr.Select(x => x.Number));

[.NET][C#][LINQ] Linq to SQLでIsNumeric

varcharなどの文字列型のプロパティに対して、値が数値に変換可能であるかを条件として LINQ to SQLで記述したい場合のTips
DataContextの部分クラス定義で下記のように記述する

partial class MyDataContext
{
    [Function(Name = "ISNUMERIC", IsComposable = true)]
    public int IsNumeric(string input)
    {
        throw new InvalidOperationException(); // this won't get called
    }
}

利用コード側ではこのように使用できる

var result = from a in context.TableName
             where context.IsNumeric(a.ColumnName) == 1 && ....;

上記のT-SQLの ISNUMERICに変換され、値が 1 なら変換可能、そうでない場合は 0 となる。
ISNUMERIC以外にも応用が利きそう。

これをdbmlファイルで定義することもできるようだ。
ネタ元stackoverflow(英語)
リンク先の例だとcontext.ISNUMERIC(text)bool型なので、intよりは書きやすいかもしれないが、dbmlファイルをデータベーススキーマから生成している場合はうれしくないかも。
ちなみに.NET4だとSqlFunctionsが用意されている。

var result = from a in context.TableName
             where SqlFunctions.IsNumeric(a.ColumnName) == 1 && ....;

[.NET][C#]コロン(:)演算子とNullable

int?型はnull許容型なので、下記のように書ける。

int? a = 1;
int? b = null;
しかし下記のようには書けない。

// compile error
int? x = true ? null : 1;
'int' と ''' の間に暗黙的な変換がないため、条件式の型がわかりません。
よって、残念なことに明示的にキャストが必要

int? x = true ? (int?)null : 1;  // もしくは null : (int?)1 ;