使用EF自己做的小功能需要遇到inner join和group by組合使用及匿名類型的處理,搜了很多,基本不能滿足自己的需要,所以總結了也實現了就自己寫出來,已備查看及伙伴查詢參考(一般的語句查詢就不說了,網絡搜索很多)
語句查詢的背景(要不直接看語句估計也夠嗆):主要想實現類似QQ相冊的功能展示,頁面展示所有相冊列表,主要包括:相冊裡面的相冊個數,相冊中的某一個張照片作為相冊的默認背景圖,相冊名,相冊描述,刪除和編輯功能
sql server:(這個就比較簡單)
select count(PhotoAlbumID) as counts,c.PhotoAlbumName,c.Describe,c.PhotoAlbumID,MAX(photourl) from
(select b.PhotoAlbumID,b.PhotoUrl,a.ID,a.PhotoAlbumName,a.Describe
from PhotoAlbum as a
inner join Photos as b on a.ID=b.PhotoAlbumID) as c
group by PhotoAlbumName,Describe,PhotoAlbumID
linq:
var photolist2 = (from a in db.PhotoAlbum
join b in db.Photos on a.ID equals b.PhotoAlbumID
group new { a, b } by new { a.PhotoAlbumName, a.Describe, a.PhotoCounts, b.PhotoAlbumID } into c
select new PhotoAlbumListModel
{
ID = c.Key.PhotoAlbumID,
PhotoAlbumName = c.Key.PhotoAlbumName,
Describe = c.Key.Describe,
PhotoCounts = c.Key.PhotoCounts,
FirstPhotoUrL = c.Max(d => d.b.PhotoUrl), //這個可以不看,看你自己的需求
}).ToList();
注意:(PhotoAlbumListModel 這個是我新建的實體類,因為原有的查詢結果集是匿名類型,到頁面識別不了,需要轉換,當然還可以使用foreach的方法轉換)
lambda:
var photolist3 = db.PhotoAlbum.Join(db.Photos, a => a.ID, b => b.PhotoAlbumID, (a, b) => new
{
a.ID,
a.PhotoAlbumName,
a.Describe,
a.PhotoCounts,
b.PhotoUrl,
b.PhotoAlbumID,
}).GroupBy(c => new { c.PhotoAlbumID, c.PhotoAlbumName, c.Describe, c.PhotoCounts }).Select(d => new PhotoAlbumListModel
{
ID = d.Key.PhotoAlbumID,
PhotoAlbumID = d.Key.PhotoAlbumID,
PhotoAlbumName = d.Key.PhotoAlbumName,
Describe = d.Key.Describe,
PhotoCounts = d.Key.PhotoCounts,
FirstPhotoUrL = d.Max(e => e.PhotoUrl), //這個可以不看,看你自己的需求
}).ToList();
注意:(PhotoAlbumListModel 這個是我新建的實體類,因為原有的查詢結果集是匿名類型,到頁面識別不了,需要轉換,當然還可以使用foreach的方法轉換)
當然方法不止一種,有其他更好更方面的也可以留言給我,不明白的也可以互相探討,我每天都會查看一次。寫的不好的,需要改進的,都可以提出意見。謝謝!