ユーザーからカンマ区切りのリストとして渡された Id のリストを使用して .Contains() を実行するために現在使用している次のスニペットがあります。このコードは完全に機能し、データは希望どおりにフィルター処理されます。
// Handle id in() statements explicitly, dynamic expression can't parse them
var idIn = new Regex("id in ?(.*)", RegexOptions.IgnoreCase);
if (idIn.IsMatch(predicate))
{
Match list = new Regex(@"in ?\((.*)\)", RegexOptions.IgnoreCase).Match(predicate);
string ins = list.Groups[1].ToString();
// Split ins and store as List<>
List<int> splitValues = ins.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries).Select(i => Convert.ToInt32(i)).ToList();
return source.Where(u => splitValues.Contains(u.Id));
}
リフレクションを使用する u オブジェクトの任意のプロパティを除いて、これと同じアイデアを使用できるようにしたいと考えています。ある時点でこのバージョンが機能していましたが、何が変わったのか、なぜ機能しなくなったのかを一生理解することはできません。これが私が持っているバージョンで、再び動作することはありません:
Match splitIn = new Regex(@"([a-zA-Z0-9\.]*) IN ?\((.*)\)", RegexOptions.IgnoreCase).Match(predicate);
string property = splitIn.Groups[1].ToString();
string ins = splitIn.Groups[2].ToString().Trim(new[] {'\'', '"'}); // Trim off separator quotes
List<string> splitValues = ins.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries).ToList();
for (int i = 0; i < splitValues.Count; i++)
{
splitValues[i] = splitValues[i].Trim(new[] {'\'', '"'});
}
Expression<Func<U, bool>> contains = u => ListContainsProperty(u, splitValues, property);
return source.Where(contains);
private static bool ListContainsProperty<U>(U u, ICollection<string> list, string property)
{
string[] split = property.Split(new[] {"."}, StringSplitOptions.RemoveEmptyEntries);
object value = split.Aggregate<string, object>(u, (current, prop) => current.GetType().GetProperty(prop).GetValue(current, null));
return list.Contains(value.ToString());
}
私が言ったように、私はかつてこの作業のいくつかのバージョンを持っていましたが、何が変わったのかわかりません。これを再び機能させるのに役立つ、私が見逃していることが露骨に明らかなものはありますか?
編集:私が知る限り、ListContainsProperty メソッドは実際には実行されていません。「throw new Exception()」を追加しても何も起こりません。フィルタリングされていない完全なリストを取得するだけです。