используйте Expression> в Linq содержит расширение

Используя следующий пример, я хотел бы использовать мой Expressionвнутри моего метода Contains, чтобы он передал запрос на сервер sql, используя 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;}
}

Я знаю, что могу передать весь предикат, но я хочу, чтобы пользователь только указал, как определить компанию из рассматриваемого объекта.

ОБНОВЛЕНИЕ

Я решил разрешить идентификатор компании, а не весь объект компании, я могу получить список идентификаторов в памяти, и меня не смущает, если это 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

Я отредактировал код, чтобы отразить то, что я действительно хотел бы сделать, но мне не очень повезло найти решение этой проблемы.

7
задан Richard Friend 11 April 2012 в 07:44
поделиться