Я пишу класс, у него есть какой-то запрос. внимание, где элемент - маленький класс, его элемент Body включает Expression<Fun<T,bool>>
лямбда-выражение, используемое для фильтрации запроса
public override List<T> Find<T>(int start, int len = 10, IWhereItem<T> whereitem = null, IOrderItem<T> orders = null, bool isDetach = true)
{
var context = getInstence();
var edminfo = EdmMgr[typeof (T)];//EdmMgr Include some dataservice infomation
ObjectQuery<T> query = context.CreateQuery<T>("[" + edminfo.TableName + "]");
if (whereitem != null && whereitem.Body != null)
query = query.Where(whereitem.Body).AsObjectQuery();
string orderString = orders == null ? "it." + edminfo.KeyName + " asc" : orders.OrderString;
List<T> result = start == -1
? query.OrderBy(orderString).ToList()
: query.OrderBy(orderString).Skip(start).Take(len).ToList();
//......and else
return result;
}
и затем, когда я запускаю его, я получаю сообщение об ошибке: «Запрос LINQ to Entities не поддерживает метод построителя запросов. Для получения дополнительной информации см. Документацию Entity Framework». *
поэтому я изменяю свой код.
public override List<T> Find<T>(int start, int len = 10, IWhereItem<T> whereitem = null, IOrderItem<T> orders = null, bool isDetach = true)
{
var context = getInstence();
var edminfo = EdmMgr[typeof (T)];
ObjectQuery<T> query = context.CreateQuery<T>("[" + edminfo.TableName + "]");
query = MemerVisitor.IncludeMembers.Aggregate(query, (current, str) => current.Include(str));
string orderString = orders == null ? "it." + edminfo.KeyName + " asc" : orders.OrderString;
List<T> result = query.OrderBy(orderString).Skip(start).Where(whereitem.Body).Take(len).ToList();
return result;
}
так. это нормально, но уродливо, правда? ГДЕ после ЗАКАЗА. когда я меняю их местоположение, я получаю сообщение об ошибке. Тип не совпадает. Какой другой хороший способ?
================== Дополнительная ============================ ==
Чтобы облегчить вызов при приеме, этот метод передает строку (например, «it.UserId desc») через оператор сортировки OrderItem, фактически, гдеIItem это Expression> пакет, мой вопрос не в том, является ли реализация фильтра сущностной структурой оператор, но может разделить цепочку операций, потому что, если первая реализация Where в запросе после того, как он преобразован в IQueryObject, а не тип ObjectQuery, поэтому один раз приведен, после реализации Orderby возникает ошибка.
Такие как:
using (DataService<User> db = new DataService<User>())
{
user = db.Find(x => x.Moreinfo.CopSchool.CopSchoolId == 13&& x.Role.Title.Equals("xxxx")).FirstOrDefault();
}
DataService, который я обернул в классе. Эквивалент DAO. Но реализуется EF.
Некоторые запросы могут быть пройдены, но некоторые нет. Причины не ясны. Но, конечно, из-за преобразования типа вызвано. Я использую. Net 3.5sp1 vs2010 модель данных объекта по умолчанию (. Edmx)
Если я направляю реализацию query.OrderBy (xxx). Пропустить (хх). Где (ххх) Возьми (хх). ToList () возвращает результаты, но есть некоторые проблемы, он является фильтром первого порядка, полученным в течение последних XX месяцев.
Я бы хотел запросить. Где (XX). OrderBy (xxx). Пропустить (хх). Возьми (хх). ToList () ... но не может быть выполнено, потому что Where (выражение) для возврата, но не ObjecteQuery IEnumerable (параметр типа Expression of the time) или IQueryable (параметр типа Func time). Где можно разместить только сзади, а Пропустить, чтобы позвонить после того, как у них есть OrderBy, Где так неловко в середине ...