我有一個方法,除了一個IEnumerable<T>
和一個lambda表達式,它描述了用來比較一個linq-to-sql集合到一個數組的字段。該方法返回匹配的記錄。匿名方法的問題
public IEnumerable<ZipCode> match<T>(IEnumerable<T> values,
Func<ZipCode, T> matchPhrase) {
return (from zipCode in _table
where values.Contains<T>(matchPhrase)
select zipCode).Distinct();
}
,我發現了錯誤:
Argument type
'Func<ZipCode, T>'
is not assignable to parameter type'T'
的方法將被稱爲像這樣(其中values
是IEnumerable<string>
和x.zipcode
是string
):
var zipCodes = _zipCodeRepository.match(values, x => x.zipcode)
UPDATE
基於使用HashSet<T>
約翰的建議,我已經改變了我的代碼,但我得到一個不同的錯誤,現在
Method 'System.Object DynamicInvoke(System.Object[])' has no supported translation to SQL.
我想我可能不會一直在清楚我的問題,我想我用錯了方法簽名來獲得我想要的結果。讓我用一個更簡單的代碼示例來解釋:
public IEnumerable<ZipCode> match(IEnumerable<string> values) {
return (from zipCode in _table
where values.Contains(zipCode.zipcode)
select zipCode).Distinct();
}
我打算完成此操作,但使用匿名類型。我想通過lambda來通過在Contains()
中使用的字段。所以zipCode.zipcode
將被傳遞到方法的第二個參數:x => x.zipcode
你幾乎肯定希望把'values'成'HashSet'在一開始,這樣就可以更有效地搜索它。因爲它是枚舉'values',對'_table'中的每個項目進行線性搜索。這是非常低效的,並且可重複枚舉多次,這真的應該在這樣的函數中避免。 – Servy