Linq To Entity經驗 如何解決按需所取

2021-09-06 08:47:00 字數 2911 閱讀 5937

已經有一陣沒有寫部落格了,並不是不想寫,只不過最近的專案實在事太多沒時間總結,最近專案客戶提到了**效能問題,這讓我不得不反思自己在專案中應entityframework是不是有些地方應該可以優化的。

常見問題:

1:entityframework如何在dbmodel(資料庫模型)與doaminmodel(領域模型)之間進行dto?

什麼是dto,就是資料轉換,我們從資料庫中查詢出來的是資料庫模型物件,和資料庫表結構是對應上的,但領域模型是給業務功能模組使用的,欄位名稱等各方面都有可能不相同。

方法一:自己編寫反射方法,進行屬性複製;下面是部分示例**         

public t returnmodel(ts c) where t : new

()

如果採用以上兩個方法進行資料庫與領域模型之間dto,那麼預設情況下,entityframework會將關聯到的表的所有欄位取到客戶端,不管你用還是不用,前提是已經關閉了entityframework延遲載入屬性。

2:entityframework能否只返回我們所需要的字段?

既然我們需要dto,又有我們不想看到的select * 的效果,那麼如何按需所取呢?

答案是肯定的,借用我同事的一句話就是:如果entityframework這點事也解決不了微軟也不好意思拿出來呀。

常見解決方案:根據不同的方法編寫不同的select,比如:

var datalist =dao.query(newfilter).select(

p => new

objectmodel.specialty

).distinct().tolist();

比如有如下表結構:

需求:查詢所有學生資訊,並且顯示每個學生的老師姓名,老師型別資訊。

也許我們需要這樣寫:

var datalist =dao.query(newfilter).select(

p => new

objectmodel.specialty

).tolist();

為何不這樣寫:

首先我們定義領域模型:

public

class

studentsummary

public

string lastname

public

string teacher_name

public

string teacher_teachertype_name

}

程式呼叫: 

var students = context.students.project().to();
多麼簡潔!來看看它的實現原理:利用反射得到資料庫模型以及領域模型的屬性資訊,然後我們利用按照一定規則定義的領域模型進行動態表示式樹(主要是select表示式樹的構建)的構建,比如上面的studentsummary中的teacher_name,為什麼中間有乙個"_",其實這是我自己定義的一種規則,用以區分是簡單屬性還是複雜屬性,說明下這裡的簡單屬性就是指資料型別是int,string這一流的,複雜屬性就是指teacher這種class型的。

老外的專案是利用大寫字母來區分的,定義成teachername,這將會分成兩個詞:teacher,以及name,那麼他認為這個teacher是乙個複雜屬性,最後面的name是乙個簡單屬性。而我在些基礎上多增加了一層支援,比如我們訪問學生的老師的型別:student.teacher.teachertype.name,如果.net定義屬效能使用"."那麼我會在student上定義這樣的屬性:teacher.teachertype.name,但不允許,我只能用"_"代替,儘管看起來有些彆扭,但好在解決了我的問題。

下面是我按自己的需求修改過的擴充套件**:

public

static

class

queryableextensions

}public

class projectionexpression

public iqueryableto()

private

static expression> getcachedexpression()

private

static expression> buildexpression()

private

static memberassignment buildbinding(expression parameterexpression, memberinfo destinationproperty, ienumerablesourceproperties)

var propertynames =splittablename(destinationproperty.name);

if (propertynames.length == 2

) }}

else

if (propertynames.length == 3

)

}else

if (propertynames.length == 1

)

else

return

null

; }

private

static

string getcachekey()

private

static

string splittablename(string

input)

}

entiryframework還是很強大的,對付一般小型專案基本不會存在效能問題,除非您的小專案會有大資料量的情況,大多數情況都是使用不當引起的效能問題。

Linq to Entity 執行儲存過程

1.在model中建立儲存過程model,將儲存過程與實體進行對映,名稱為儲存過程名 result 其中的屬性是儲存過程的返回值 create procedure ten most expensive products as set rowcount 10 select products.produ...

如切如磋,如琢如磨

有點難受的一天,以為幹了好多事情,晚上來機房補題,機房4個人,三個大佬乙個我。大佬們說的題和演算法我根本聽不懂,很挫敗。bgm my songs know what you did in the dark light em up string 我也不知道這首歌歌名為什麼沒有右括號 兩年了,我還是什麼...

Linq to entity 3 5 左聯接問題

在linq to sql 中左聯接可以這麼寫 from q1 in table1 join q2 in table2 on q1.col equals q2.col into tem table from q3 in tem table.defaultifempty select new 但是在li...