【发布时间】:2013-02-04 19:51:34
【问题描述】:
我有一个方法,除了 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();
}
我收到了错误:
参数类型
'Func<ZipCode, T>'不能分配给参数类型'T'
该方法会这样调用(其中values 是IEnumerable<string>,x.zipcode 是string):
var zipCodes = _zipCodeRepository.match(values, x => x.zipcode)
更新
根据 John 关于使用 HashSet<T> 的建议,我已经更改了代码,但是现在出现了不同的错误
方法 'System.Object DynamicInvoke(System.Object[])' 不支持 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中的每个项目进行线性搜索。这既非常低效,又要多次迭代可枚举,在这样的函数中确实应该避免这种情况。
标签: c# linq-to-sql lambda anonymous-types