2013-10-31 123 views
0

我正在使用linq表達式樹(http://msdn.microsoft.com/en-us/library/vstudio/bb397951.aspx)創建複雜的動態創建的自定義過濾器。 現在我需要創建一個表達式,它不比較我表的屬性,但是我的拆分屬性的每個部分都有 。表達式樹來拆分屬性值

相應的靜態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」並獲取第一行。

如何爲分割func創建lambda表達式<>?

UPDATE:這是我到目前爲止的狀態(在我被卡住的最後一行)。另外我試圖用ExpressionTreeViewer從上面的linq語句構建表達式樹,但它不起作用,我認爲是因爲「.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); 
+1

'.FirstOrDefault(p => p.Contains(「part3」));' – Sam

+0

@Rune FS:你爲什麼改變標題?我不感興趣得到linq查詢。這很簡單。我需要真正的linq表達式語句。 – StefanG

+0

什麼是「linq表達式語句」? :| – BartoszKP

回答

0

多次嘗試之後,我認爲這是不可能的表達式樹做。 我最終做的是改變我的數據模型。

UPDATE由於一週內沒有新的輸入,我將其設置爲答案。

0
.Where(t => t.Any(i => i=="part3")) 
+0

有關如何以及爲什麼您的答案可以工作的一點說明會很好。現在它只是一段代碼。 – VDWWD

-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); 
-1

我想這是你想要什麼:

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