次の例を使用してExpression
、Contains メソッド内で使用し、EF
.
これを正しく動作させるにはどうすればよいですか?
void Main()
{
IQueryable<Person> qry = GetQueryableItemsFromDB();
var filtered = qry.Filter(p=>p.CompanyId);
}
public static class Ext
{
public static IQueryable<T> Filter<T>(this IQueryable<T> items, Expression<Func<T, int>> resolveCompanyIdExpression)
{
IEnumerable<int> validComps = GetCompanyIdsFromDataBase();
var exp = Expression.Lambda<Func<T, bool>>(
Expression.Call(typeof(Queryable),"Contains", new[] { typeof(Company) },
Expression.Constant(validComps),
resolveCompanyIdExpression.Body),
resolveCompanyIdExpression.Parameters[0]);
return items.Where(exp);
}
public static IQueryable<T> Filter<T>(this IQueryable<T> items, Expression<Func<T, IEnumerable<int>>> resolveCompanyIdExpression)
{
IEnumerable<int> validComps = GetCompanyIdsFromDataBase();
//No Idea what to do here ?
}
}
public class Person
{
public int CompanyId {get;set;}
}
述語全体を渡すことができることはわかっていますが、問題のエンティティから会社を解決する方法をユーザーに提供してもらいたいだけです。
アップデート
会社エンティティ全体ではなく、companyId を解決することにしました。メモリ内の ID のリストを取得できます。それが IQueryable であるか、単なる配列/IEnumerable である場合は、大騒ぎしません。
ただし、いくつかの奇妙なエラーが発生します。
Extent.Select(o => o).Where(p => (p.Hide = False)).Where(p => (p.Archived = False)).Where(item = の実行中に例外が発生しました> System.Int32[].Contains(item.Development.CompanyId))'. 詳細については、InnerException を参照してください。
内部例外は
引数式が無効です
更新 2
私は本当にやりたいことを反映するようにコードを編集しましたが、これに対する解決策を見つけることができませんでした。