我正在建立我自己的反射函數爲某些類型的搜索。反射Linq實體「IN()」函數爲「包含」搜索整數組
問題是我想在ID列表中搜索一組ID,並過濾我的搜索/選擇查詢以僅包含這些特定對象。
這與在Linq-Entity框架中使用「IN()」相同。但我不能使用a.objid。
return query.Where(a => ObjectsToFind.Contains(a.objid));
但是,因爲我用t樣板 「a.objid」 導致錯誤。
所以a是「T a」而不是「MyTable a」,所以我可以稱它爲「objid」屬性。
我知道有一種方法可以用參數表達式來做到這一點。但是,我無法弄清楚。
這裏就是我試圖替換上述行:
public static IQueryable<T> WhereFunctionContains<T>(this IQueryable<T> query, string contains)
{
var ObjectsToFind = new List<int>(); // I want to search IN() this function that gets filled in here.
ObjectsToFind = FillObjectsToFind(); // just the object id integers I want to filter
var parameter = Expression.Parameter(typeof(T), "type");
var propertyExpression = Expression.Property(parameter, "objid"); // I look for this
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(int) }); // int type
var vars = Expression.Variable(List<int>,); // I can't use "constant", but what do I use here?
var containsExpression = Expression.Call(propertyExpression, method, vars);
return query.Where(Expression.Lambda<Func<T, bool>>(containsExpression, parameter));
}
更換「T」與實際表實體,會導致很多的問題,所以我決定保持T.
else if (s.ST == "function")
{ // search func
myTable a;
DC2 = MyUtility.WhereFunctionContains(DC2, a => a.objid, s.S);
// s.S is my search query string.
// s.ST means I'm searching for functions (from another associated table)
// I don't understand how a.objid gets called, I wanted to use Template/Reflections.
}
下面是我如何調用Zev的函數。
public static IQueryable<T> WhereFunctionContains<T>(this IQueryable<T> query, Expression<Func<T, int>> converter, string contains)
{
FunctionsClass fc = new FunctionsClass();
var ObjectsToFind = new List<int>();
ObjectsToFind = fc.SearchContainFunction(contains); // I grabbed my list of IDs to search
return query.Where(t => ObjectsToFind.Contains(converter(t)));
}
你可以在你的問題中包含什麼類型的ObjectsToFind? – EkoostikMartin
'因爲我使用T模板而導致錯誤',這是因爲你的'template'錯過了一些限制信息,比如使用'where T:...' –
ObjectsToFind ===> List() –
Dexter