Linq to Entities 蛋疼錦集 第一期

2022-03-11 09:13:17 字數 3425 閱讀 7724

【開發環境】

框架: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不支援複雜型別?

我這裡確實用到了複雜型別:

public

class resultmodel

public

string keywords

public ienumerable codes

}

model裡面包含了 ienumerable.於是將其替換成 :

public

class resultmodel

public

string keywords

//public ienumerablecodes

public

int counts

}

在controller層也做如下修改:

var result = db.m

.select(p =>new resultmodel)

.orderby(p => p.id)

.skip((pageindex-1)*pagesize)

.take(pagesize)

.tolist();

此時,順利取出資料,並正確帶出了counts數目。也就印證了,問題的關鍵:

linq to entities不支援複雜型別

但是,我又該如何解決問題呢?我需要取出那樣子的結構,怎麼去實現呢?

如果可以實現拼接string的話, ienumerable可以用帶分隔符的string來替代。

在msdn上查了很多資料,linq to entities也沒有找到什麼方法可以支援拼接string。

無奈,谷哥提示我,實在沒辦法就捨棄掉關聯,使用join語句。

所以,產生了以下解決辦法:

先通過groupjoin查詢出符合條件的主表主鍵,進行排序後分頁。再通過關聯,取出從表資料。

這樣,就避免了關聯後分頁。

**如下: 

public viewresult index(int pageindex=1,int pagesize=5)

).tolist();

return view(result);

}

ok.這樣做確實解決了問題。得到了想要的結果。

但是,效率上真心打折扣了!希望有大牛給出更好的解決方案!還有各位的各種吐槽,非常歡迎!

下篇將分析和這個問題有點關係的第二個棘手的問題。慢慢等吧!

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,直到這一段...