2017-09-25 54 views
2

我試圖創建一個自定義的LINQ到用逗號分隔的字符串,將其轉換爲一個數組實體擴展方法,然後使用IEnumerable<string>.Contains產生相當於的SQL IN子句。自定義擴展方法中的LINQ EF相當於SQL「IN」的條款

很容易,當你總是知道表/實體及其列/要將此過濾器應用於屬性。我們面臨的挑戰是,我希望能夠利用這個擴展方法上的任何實體或財產。

這是多遠我來:

public static IQueryable<TSource> CustomInClause<TSource>(this IQueryable<TSource> myQuery, Expression<Func<TSource, string>> colExpression, string filterCriteria) 
{ 
    string[] myArray = filterCriteria.Split(",", StringSplitOptions.RemoveEmptyEntries); 

    //Various other operations here.............. 

    if (myArray.Length > 0) 
    { 
     myQuery = myQuery.Where(b => myArray.Contains(colExpression)); 
    } 

    return myQuery; 
} 

正如你所看到的,我試圖用colExpression作爲一個動態的表達,這將是x => x.SomeColumn相當於其中SomeColumn可以是任意的字符串/ VARCHAR柱。

然後,我會實現這個擴展是這樣的:

var q = context.SomeTable.CustomInClause(f => f.SomeColumn, someString); 

var q2 = context.OtherTable.CustomInCluse(f => f.OtherColumn, otherString); 

現在我得到這個錯誤:

'string[]' does not contain a definition for 'Contains' and the best extension method overload 'ParallelEnumerable.Contains>>(ParallelQuery>>, Expression>)' requires a receiver of type 'ParallelQuery>>'

我不太知道如何在這種情況下使用並行查詢,或者如果有另一種解決方案。有任何想法嗎?

回答

0

你必須建立Contains調用作爲表達的一部分,在where子句

var myArray = filterCriteria.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries) 
       .ToList(); 
var containsExp = Expression.Call(Expression.Constant(myArray), 
            "Contains", null, colExpression.Body); 

if (myArray.Count > 0) 
{ 
    myQuery = myQuery.Where(Expression.Lambda<Func<TSource, bool>> 
             (containsExp, colExpression.Parameters)); 
} 

return myQuery; 

列表比在這種情況下數組更好,因爲列表中有Contains功能和Array只有擴展

+0

是!這工作完美。 –