2010-09-07 32 views
2

我們有一個字符串列表,我們需要按照該列表篩選結果。例子是找到誰具有與465,496,497或啓動(加X更多)核動力攻擊型潛艇的所有學生在一個Linq to Entities查詢中多次執行「like」運算符

List<string> list = GetPossibleStartsWithValues(); 
var qry = from student in entities.Students.WhereStartsWith(x=>x.SSN, list) 
select new SearchedStudent 
{ 
    Name = student.Name, 
    SSN = student.SSN, 
    ... 
} 

提供的代碼here接近我們所需要的,但我們不能找出如何啓發我們需要使用表達式類的StartsWith。

回答

1

那麼,你可以嘗試

public static IQueryable<T> WhereStartsWith<T>(this IQueryable<T> source, 
    Expression<Func<T, string>> projection, 
    List<T> list) 
{ 
    return source.Where(x => list.Any(y => projection(x).StartsWith(y))); 
} 

這很有可能無法正常工作,但你進入什麼更復雜的前這將是值得一試。

編輯:正如你所說,上述不會編譯 - 你基本上需要建立一個表達式樹,代表Where子句中的位。哎呀。然而,在你開始這樣做之前,最好看看它是否會最終工作。試試這個:

List<string> list = GetPossibleStartsWithValues(); 
var qry = from student in entities.Students 
    .Where(student => list.Any(y => student.SSN.StartsWith(y))) 
select new SearchedStudent 
{ 
    Name = student.Name, 
    SSN = student.SSN, 
    ... 
} 

如果不工作,然後又做了更一般的方法不會有任何用處:(

+0

我不能得到代碼來編譯我得到的錯誤'投影'是一個'變量',但像'方法'一樣使用,我需要改變什麼? – johnnywhoop 2010-09-07 16:52:11

+0

@johnnywhoop:哎呀。當我回家時會修復。 – 2010-09-07 17:02:13

+0

是啊創建一個表達式會使它更快嗎?它看起來很慢但是可用。 – johnnywhoop 2010-09-10 17:20:02

0

如何使用複合語句如

var qry = from student in entities.Students.Where( 
      s => list.Where(x => s.StartsWith(x)).Count() != 0)