Entity Framework 4.1 простое динамическое выражение для object.property = значение - PullRequest
1 голос
/ 28 июня 2011

Я знаю, что есть способ использовать выражения и лямбда-выражения для достижения этой цели, но мне было трудно собрать их все воедино.Все, что мне нужно, - это метод, который будет динамически запрашивать объект DBSet Entity Framework, чтобы найти строку, в которой свойство с данным именем соответствует значению.

Мой контекст:

public class MyContext : DbContext
{
    public IDbSet<Account> Accoounts{ get { return Set<Account>(); } } 
}

Методчто я хочу написать:

public T Get<T>(string property, object value) : where T is Account
{...}

Я бы предпочел не использовать динамический SQL для этого, поэтому нет необходимости предлагать его, потому что я уже знаю, что это возможно.Что я действительно ищу, так это некоторую помощь для достижения этой цели с помощью выражений и лямбд

Заранее спасибо, я знаю, что это кратко, но это должно быть довольно понятно.Комментарий, если требуется дополнительная информация

Ответы [ 3 ]

2 голосов
/ 28 июня 2011

Я стараюсь максимально избегать динамического linq, потому что основной смысл linq - строго типизированный доступ.Использование динамического linq - это решение, но оно противоположно цели linq, и оно очень близко к использованию ESQL и построению запроса из конкатенации sting.В любом случае, динамический linq иногда экономит время (особенно когда речь идет о сложном динамическом упорядочении), и я успешно использую его в большом проекте с Linq-to-Sql.

Обычно я определяю некоторые SearchCriteriaКласс вроде:

public class SearchCriteria
{
     public string Property1 { get; set; }
     public int? Property2 { get; set; }
}

И метод расширения вспомогательного запроса, например:

public static IQueryable<SomeClass> Filter(this IQueryable<SomeClass> query, SearchCriteria filter)
{
     if (filter.Property1 != null) query = query.Where(s => s.Property1 == filter.Property1);
     if (filter.Property2 != null) query = query.Where(s => s.Property2 == filter.Property2);
     return query;
}

Это не универсальное решение.Опять же, универсальное решение предназначено для некоторой строго типизированной обработки классов с некоторым поведением.

Более сложным решением было бы использование построителя предикатов и построение дерева выражений самостоятельно, но опять же построение дерева выражений - это только более сложный способ построения запроса ESQL путемобъединяющие строки.

1 голос
/ 06 января 2013

Вот моя реализация:

public T Get<T>(string property, object value) : where T is Account
{
    //p
    var p = Expression.Parameter(typeof(T));

    //p.Property
    var propertyExpression = Expression.Property(p, property);

    //p.Property == value
    var equalsExpression = Expression.Equal(propertyExpression, Expression.Constant(value));

    //p => p.Property == value
    var lambda = Expression.Lambda<Func<T,bool>>(equalsExpression, p);

    return context.Set<T>().SingleOrDefault(lambda);
}

Используется метод EF 5 Set<T>(). Если вы используете более низкую версию, вам нужно реализовать способ получения DbSet на основе типа <T>.

Надеюсь, это поможет.

1 голос
/ 28 июня 2011

Динамический Linq может быть вариантом.Укажите ваш критерий как строку, и он будет построен как выражение и будет работать с вашими данными;

Пример из того, что я сделал;

var context = new DataContext(ConfigurationManager.ConnectionStrings["c"].ConnectionString);
var statusConditions = "Status = 1";
var results = (IQueryable)context.Contacts.Where(statusConditions);

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

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