gpt4 book ai didi

c# - 重构返回匹配值的linq-to-sql方法

转载 作者:太空宇宙 更新时间:2023-11-03 11:09:04 25 4
gpt4 key购买 nike

我有一个简单的 linq-to-sql 语句匹配 string[] 中的值到表中的值并返回匹配的表值。

_table类型为 System.Data.Linq.Table<TEntity>

public IEnumerable<ZipCode> match(IEnumerable<string> values) {
HashSet<string> valueSet = new HashSet<string>(values);
return _table.Where(x => valueSet.Contains(x.zipcode);
}

我如何重构它,以便我可以将要使用的字段传递给 Contains()

我失败的尝试:

public IEnumerable<ZipCode> match<T>(IEnumerable<T> values, 
Expression<Func<ZipCode, T>> field) {
HashSet<T> valueSet = new HashSet<T>(values);
return _table.Where(x => valueSet.Contains(field(x)));
}

这会产生错误:

Method 'System.Object DynamicInvoke(System.Object[])' has no supported translation to SQL.

我的想法是我可以使用表达式树来为 Contains() 提供字段但对如何或是否这甚至是使用表达式的正确方法感到困惑。可能有更好的解决方案。

最佳答案

我能够使用以下内容(在 .NET 4.5 中,但我相信它可以在早期版本中使用)

static IEnumerable<TTable> Match<TTable, TField>(IQueryable<TTable> table, IEnumerable<TField> values, Expression<Func<TTable, TField>> fieldSelector)
{
var valuesConstant = Expression.Constant(values.Distinct());

var callContains = Expression.Call(typeof(Enumerable), "Contains", new[] { typeof(TField) }, new Expression[] { valuesConstant, fieldSelector.Body });

var whereExpression = Expression.Lambda<Func<TTable, bool>>(callContains, (fieldSelector.Body as MemberExpression).Expression as ParameterExpression);

return table.Where(whereExpression);
}

您应该可以删除我使用的表参数并使用您拥有的成员变量。

关于c# - 重构返回匹配值的linq-to-sql方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14709559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com