Я пишу класс, у него есть запрос. Внимание, whereitem немного класса, его член тел включает в себя выражение а Expression<Fun<T,bool>>
лямбды используются для фильтрации запросаПроблемы с запросами Framework Entity
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 к 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;
}
so. это нормально, но уродливо, не так ли? WHERE после ORDERBY. когда я меняю свое местоположение, я получаю сообщение об ошибке. Тип не соответствует. Какой еще хороший способ?
Дополнительная информация ============================================================================================================================================================= ===
Чтобы облегчить прием, вызовите этот метод, передавая строку (например, «it.UserId desc») над оператором сортировки OrderItem, на самом деле WhereItem является выражением> пакет, мой вопрос заключается не в том, следует ли реализовать фильтр является выражением сущности, но может разделить операцию цепочки, потому что если первая реализация 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). Пропустить (xx). Где (xxx). Возьмите (xx). ToList(), чтобы возвращать результаты, но есть некоторые проблемы, он является фильтром первого порядка, полученным в пропуске последних xx месяцев.
Я хотел бы запросить.Where (XX). OrderBy (xxx). Пропустить (xx). Возьмите (xx). ToList() ... но не может быть выполнено, потому что возвращаемое значение Where (Expression), но не ObjecteQuery IEnumerable (тип параметра Expression of the time) или IQueryable (параметр времени типа Func). Где могут быть размещены только на спине, в то время как Скип звонить после того как они имеют OrderBy, где так неловко в середине ...
@user: просьба представить немного подробно о том, что проблема на самом деле происходит. Есть ли исключение? Тогда, пожалуйста, опубликуйте его. Не все из нас могут читать мысли. –