【開發環境】
框架:ef4.1(linq to entities) mvc3.0
資料庫:mysql
【場景描述】
1、兩表主鍵關聯,主表與從表的關係為一對多(即從表至少有兩個主鍵)。[其實是多對多表中,主表和中間表的關係]看圖:
主表:m表:
從表:c表
很容易看出,m表主鍵id和c表的第乙個主鍵id關聯。
2、現在我造一些資料,並用圖畫出需要返回的資料格式。看圖:
m表資料
c表資料
返回資料(主表同時帶出對應從表 分頁後的資料,如圖為每頁5條資料)
[不知道讀者注意到沒有,該返回資料中,沒有分頁欄,
因為,分頁跳轉等不是本文重點,為減輕demo,
說明問題,僅在後台進行分頁,前台返回對應結果即可]
}4、view頁面就不給出來了,不是重點。問題來了。看圖:
【問題分析】
僅僅根據報錯資訊,空物件,很難看出**出的問題,當然有經驗的人肯定一眼就看出來問題的關鍵。
經過簡單排除,我將問題範圍縮小到skip、take、tolist
繼續排除,如下幾種情況都可以通過:
var result =r2.skip(5);
var result =r2.skip(5).take(5);
var result =r2.take(5);
var result =r2.tolist();
如下幾種情況不通過:
var result =r2.skip(5).tolist();
var result =r2.take(5).tolist();
var result =r2.skip(5).take(5).tolist();
也就是說,使用了skip()和take()方法之後,不可以tolist()。
這是為什麼呢?
跑到msdn上查了相關資訊:支援的和不支援的方法 (linq to entities)
資料顯示,其實,linq to entities肯定是支援skip和take的,不然怎麼分頁啊,傻!
突然聯想到,難道是因為linq to entities不支援複雜型別?
我這裡確實用到了複雜型別:
publicmodel裡面包含了 ienumerable.於是將其替換成 :class resultmodel
public
string keywords
public ienumerable codes
}
public在controller層也做如下修改:class resultmodel
public
string keywords
//public ienumerablecodes
public
int counts
}
var result = db.m此時,順利取出資料,並正確帶出了counts數目。也就印證了,問題的關鍵:.select(p =>new resultmodel)
.orderby(p => p.id)
.skip((pageindex-1)*pagesize)
.take(pagesize)
.tolist();
linq to entities不支援複雜型別
但是,我又該如何解決問題呢?我需要取出那樣子的結構,怎麼去實現呢?
如果可以實現拼接string的話, ienumerable可以用帶分隔符的string來替代。
在msdn上查了很多資料,linq to entities也沒有找到什麼方法可以支援拼接string。
無奈,谷哥提示我,實在沒辦法就捨棄掉關聯,使用join語句。
所以,產生了以下解決辦法:
先通過groupjoin查詢出符合條件的主表主鍵,進行排序後分頁。再通過關聯,取出從表資料。
這樣,就避免了關聯後分頁。
**如下:
public viewresult index(int pageindex=1,int pagesize=5)ok.這樣做確實解決了問題。得到了想要的結果。).tolist();
return view(result);
}
但是,效率上真心打折扣了!希望有大牛給出更好的解決方案!還有各位的各種吐槽,非常歡迎!
下篇將分析和這個問題有點關係的第二個棘手的問題。慢慢等吧!
LINQ to Entities 常用查詢語句
要使用關聯實體返回區域性或完整的物件圖,需要在linq 標準查詢操作符之前執行include 操作符,如下列查詢所示,它將返回和前面 使用include 操作符進行預先載入 一節同樣的結果 using northwindentities ocnwind new northwindentities n...
Linq to Entities不識別方法
db.uservalidates.include a a.user where uv u.uservalidates.contains uv,c tolist 執行時出現 linq to entities不識別方法 解決方式可以使用lambda表示式樹 expressionbool express ...
蛋疼度度熊
先把這些線段以左端點公升序排列,然後把重疊的,重合的,還有一些什麼特殊的情況都處理出來,把連續的幾段處理成一段 dalao說可以不處理 然後開乙個佇列,從前往後壓入佇列,如果出現了斷開的部分,就用m比較,如果小於m,就把m減去這一段的長度,然後壓入佇列,如果大於m,就彈出隊首元素,增加m,直到這一段...