Построение динамических запросов LINQ со всеми свойствами объекта - PullRequest
0 голосов
/ 15 ноября 2010

Привет! Я хочу создать динамический запрос Entity Framework Linq со всеми свойствами объекта. Пример

Я хочу: - 1) Тест объекта имеет 5 открытых свойств. 2) Я хочу перебрать этот объект и проверить, является ли каждое строковое свойство нулевым или пустым. 3) Если нет, я хочу написать запрос, который добавит условие where для поиска сущности с этим значением свойства.

    public void CheckMyEntity(IQueryable<ABCEty> _allABCs, MyEntity _MyEntityProperty)
    {
        foreach (var prop in _MyEntityProperty.GetType().GetProperties())
        {
            if (!String.IsNullOrEmpty(prop.GetValue(_MyEntityProperty,null).ToString()))
            {
                _allABCs = _allABCs.Where(temp => (temp.ABCMyEntitys.All(MyEntity => MyEntity.MyEntity.<<I cant insert the property here>> == prop.GetValue(_MyEntityProperty,null));
            }
        }
    }

Любая помощь будет очень полезна! Спасибо!

Ответы [ 2 ]

3 голосов
/ 15 ноября 2010

Вы можете превратить каждое PropertyInfo в лямбда-выражение и передать его в запрос

public static void CheckMyEntity(IQueryable<ABCEty> _allABCs, MyEntity _myEntity)
{
    foreach (var propertyInfo in _myEntity.GetType().GetProperties())
    {
        if (!String.IsNullOrEmpty(propertyInfo.GetValue(_myEntity, null).ToString()))
        {
            //access to modified closure
            PropertyInfo info = propertyInfo;
            _allABCs = _allABCs.Where(temp => temp.ABCMyEntitys.All(GenerateLambda(_myEntity, info)));
        }
    }
    var result = _allABCs.ToList();
}

private static Func<MyEntity, bool> GenerateLambda(MyEntity _myEntity, PropertyInfo propertyInfo)
{
    var instance = Expression.Parameter(propertyInfo.DeclaringType, "i");
    var property = Expression.Property(instance, propertyInfo);
    var propertyValue = Expression.Constant(propertyInfo.GetValue(_myEntity, null));
    var equalityCheck = Expression.Equal(property, propertyValue);
    return Expression.Lambda<Func<MyEntity, bool>>(equalityCheck, instance).Compile();
}
0 голосов
/ 15 ноября 2010

Существует небольшая библиотека Dynamic Linq, которая выполняет текстовую оценку. http://www.hanselman.com/blog/TheWeeklySourceCode48DynamicQueryableMakesCustomLINQExpressionsEasier.aspx

Dim query = Northwind.Products
            .Where("CategoryID=2 And p.UnitPrice>3")
            .OrderBy("SupplierID")

Проще говоря, этот класс выполняет оценку текста и преобразует его в дерево выражений Linq, которое может обрабатывать большинство поставщиков LinQ, например Entity Framework.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...