[英]C# Linq generic search
我正在嘗試為基礎存儲庫服務編寫一種方法。 我的想法是我想要一個可以用於簡單實體類型的泛型類,也可以為更復雜的實體覆蓋。 我正在編寫一種搜索方法,其想法是,對於簡單實體,將存在一個組件,該組件將具有一個或多個屬性,且字段與該實體的屬性相匹配。 如果找到了這些,則構建一個where linq語句來查詢它。 這是我到目前為止的內容:
public IQueryable<T> GetAll()
{
return entityRepository.GetAll();
}
public IQueryable<T> Search(IBaseComponent component)
{
IQueryable<T> all = GetAll();
Type type = typeof(T);
Type componentType = component.GetType();
foreach (var componentProperty in componentType.GetProperties())
{
foreach (var property in type.GetProperties())
{
if (property.Name.Equals(componentProperty.Name))
{
var value = componentProperty.GetValue(component);
ParameterExpression gpe = Expression.Parameter(property.DeclaringType, "a");
var selector = Expression.Equal(Expression.Property(gpe, property), Expression.Constant(value));
var keySelector = Expression.Lambda(selector, gpe);
var t = all.Where(keySelector);
break;
}
}
}
var test = all.ToArray();
return all;
}
顯然,這目前僅在理論上適用於一種財產。 服務本身具有類型參數(因此其BaseService<T>
)。
我遇到的問題是它將無法編譯。 行all.Where(keySelector)
給出錯誤:
'System.Linq.IQueryable<T>' does not contain a definition for 'Where' and the best extension method overload 'System.Linq.Enumerable.Where<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,int,bool>)' has some invalid arguments
我不確定這里出什么問題,據我所知,它們的類型都是正確的。 我想念什么? 還是我想做些不可能的事情?
即使具體類型為Expression<Func<T, bool>>
Expression.Lambda
返回類型也為LambdaExpression
( LambdaExpression
是Expression<T>
的非通用基類)
@Euphoric的評論很明顯,而var
關鍵字是這里的問題,因為沒有它,此錯誤的原因就很明顯了。
正確的代碼是這樣的:
var keySelector = (Expression<Func<T, bool>>)Expression.Lambda(selector, gpe);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.