この機能は本当に便利です。同様の機能がADO.net Datatablesに存在します。LinqToSqlにとっても非常に役立ちます。確かに、厳密に型指定されたチェックは失われますが、それが要点です。動的検索が必要です。例外を適切に処理すれば、それは持つ価値のある機能だと本当に思います。
Microsoft Connectに機能要求を追加することを検討してください。ライブラリはすでに存在し、正式なサポートを追加することを検討する可能性があります。機能リクエストを行う場合は、ここにリンクを投稿して、投票できるようにしてください。Microsoft Connect には、stackoverflow に似た投票システムがあります。LinqtoSql TableUpdateとVB.net Readonly Interfaces like C#をいくつか提出しました。
このライブラリに問題があったことを覚えています。静的メソッドと関係があると思います。
必要な表現を開発したほうがよいことがわかりました。Ilya Builuk によるこの記事では、カスタム式を示しています。Ilya のフレームワークの良いところは、jqGrid の並べ替えなどの操作を行うときに、多くの定型コードを削除できることです。
式の根底にある概念について学ぶのに非常に役立ちました。
このコードの良いところは、ゲッターにドット演算子を使用できることです。Person.Age
または、Demeter に違反したい場合は、複数のゲッターを実行することもできます。
コードは改善できます。追加StartsWith
して、文字列操作と他のいくつかの検索操作にのみ許可したと思います。一見の価値はありますが、linq 式を理解するのに大いに役立ちました。
public static IQueryable<T> Where<T>(this IQueryable<T> query, string column, object value, WhereOperation operation)
{
if (string.IsNullOrEmpty(column))
return query;
ParameterExpression parameter = Expression.Parameter(query.ElementType, "p");
MemberExpression memberAccess = null;
foreach (var property in column.Split('.'))
memberAccess = MemberExpression.Property
(memberAccess ?? (parameter as Expression), property);
//change param value type
//necessary to getting bool from string
ConstantExpression filter = Expression.Constant
(
Convert.ChangeType(value, memberAccess.Type)
);
//switch operation
Expression condition = null;
LambdaExpression lambda = null;
switch (operation)
{
//equal ==
case WhereOperation.Equal:
condition = Expression.Equal(memberAccess, filter);
lambda = Expression.Lambda(condition, parameter);
break;
//not equal !=
case WhereOperation.NotEqual:
condition = Expression.NotEqual(memberAccess, filter);
lambda = Expression.Lambda(condition, parameter);
break;
//string.Contains()
case WhereOperation.Contains:
condition = Expression.Call(memberAccess,
typeof(string).GetMethod("Contains"),
Expression.Constant(value));
lambda = Expression.Lambda(condition, parameter);
break;
}
MethodCallExpression result = Expression.Call(
typeof(Queryable), "Where",
new[] { query.ElementType },
query.Expression,
lambda);
return query.Provider.CreateQuery<T>(result);
}
WhereOperation 列挙子:
public enum WhereOperation { Equal, NotEqual, Contains }