0

私は linq 式ツリー ( http://msdn.microsoft.com/en-us/library/vstudio/bb397951.aspx ) を使用して、動的に作成された複雑なカスタム フィルターを作成しています。ここで、テーブルのプロパティではなく、分割されたプロパティのすべての部分を比較する式を作成する必要があります。

対応する static linq ステートメントは次のようになります。

myContext.MyEntityCollection
 .Where(item => item.MyProperty != null)
 .AsEnumerable<MyEntity>()
 .Select(item => item.MyProperty.Split(new[] { ',' })
 .Where( .. my filter ..)

たとえば、この入力で

Table MyEntity
Id          MyProperty
-----------------------------------
1           part1,part2,part3,part4
2           part5,part6

「part3」を検索して1行目を取得したいです。

split func<> のラムダ式を作成するには?

更新:これが私がこれまでに得たステータスです(最後の行で行き詰まります)。また、上記の linq ステートメントから ExpressionTreeViewer を使用して式ツリーを構築しようとしましたが、「.AsEnumerable」が原因で機能しません。

ParameterExpression param = Expression.Parameter(typeof(ReportIndex), "MyEntity");
MemberExpression stringProperty = Expression.Property(param, "MyProperty");
MethodInfo mi = typeof(string).GetMethod("Split", new[] { typeof(char[]) });
MethodCallExpression splitExpression = 
    Expression.Call(exDateProperty, mi, Expression.Constant(new[] { '|' }));
MethodInfo containsMethod = typeof(ICollection<string>).GetMethod("Contains");
var expression = Expression.Call(param, containsMethod, splitExpression, stringProperty);
4

4 に答える 4

0
.Where( t => t.Any(i => i=="part3"))
于 2013-10-31T11:06:51.103 に答える
-1

指定された基準に一致するアイテムを取得するには、次を使用します。

var rows = myContext.MyEntityCollection
    .Where(item => item.MyProperty != null)
    .AsEnumerable<MyEntity>()
    .FirstOrDefault(item => item.MyProperty.Contains("part3"));

一致するすべての行を取得するには:

var rows = myContext.MyEntityCollection
    .Where(item => item.MyProperty != null)
    .AsEnumerable<MyEntity>()
    .Where(item => item.MyProperty.Contains("part3"));

または、何らかの理由で使用する必要がある場合Split:

var rows = myContext.MyEntityCollection
    .Where(item => item.MyProperty != null)
    .AsEnumerable<MyEntity>()
    .Where(item => item.MyProperty.Split(new[] { ',' }).Contains("part3"));

もう少し明確なバージョン:

var rows = myContext.MyEntityCollection
    .Where(item => item.MyProperty != null)
    .AsEnumerable<MyEntity>()
    .Select(item => new 
        {
            Item = item,
            Parts = item.MyProperty.Split(new[] { ',' })
        })
    .Where(itemWithParts => itemWithParts.Parts.Contains("part3"))
    .Select(itemWithParts => itemWithParts.Item);
于 2013-10-31T11:24:58.657 に答える
-1

これがあなたが望むものだと思います:

myContext.MyEntityCollection
    .Where(item => item.MyProperty != null)
    .AsEnumerable<MyEntity>()
    .Where(item => item.MyProperty.Split(new [] { ',' }).Any(p => p == "part3"));
于 2013-10-31T11:33:15.257 に答える