我寫了一個類,它有一些查詢。注意,該whereitem有點類,它的主體構件包括Expression<Fun<T,bool>>
lambda表達式用來過濾查詢實體框架查詢的問題
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到實體查詢不支持查詢構建器方法。有關更多信息,請參閱實體框架文檔。「
所以我改變我的代碼。
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;
}
所以。沒關係,但很醜陋,對吧? ORDERBY之後的WHERE。當我改變他們的位置時,我得到一個錯誤。類型不匹配。還有什麼其他好方法?其他=========================== ===
爲了方便接收調用這個方法在OrderItem排序語句上傳遞一個字符串(例如「it.UserId desc」),實際上WhereItem是Expression>包,我的問題不是是否要實現該過濾器是entityframework語句,但是可以拆分鏈式操作,因爲如果先執行Where中的查詢之後,他將其轉換爲IQueryObject而不是ObjectQuery類型,那麼一旦執行了Cast,執行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()返回結果,但存在一些問題,他是在skip的最後xx個月中獲得的一階過濾器。
我想query.Where(XX)。 OrderBy(xxx)。跳過(xx)。拿(xx)。 ToList()...但不能執行,因爲Where(表達式)返回但不是ObjecteQuery IEnumerable(參數類型表達式的時間)或IQueryable(參數類型爲Func時間)。如果只能放在後面,而跳過調用後,他們有排序依據,凡在中間這麼彆扭......
@user:請提供什麼問題實際上出現一個小細節。是否有例外?然後請張貼它。並非我們所有人都能讀懂頭腦。 – 2010-07-22 01:59:14