已經有一陣沒有寫部落格了,並不是不想寫,只不過最近的專案實在事太多沒時間總結,最近專案客戶提到了**效能問題,這讓我不得不反思自己在專案中應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,但不允許,我只能用"_"代替,儘管看起來有些彆扭,但好在解決了我的問題。
下面是我按自己的需求修改過的擴充套件**:
publicentiryframework還是很強大的,對付一般小型專案基本不會存在效能問題,除非您的小專案會有大資料量的情況,大多數情況都是使用不當引起的效能問題。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)
}
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...