首先我写了这个查询
var lst = (from mediaref in MediaRefs
join media in Medias
on mediaref.Int_MediaId equals media.Int_MediaId
join mediatype in MediaTypes
on media.Int_MediaTypeId equals mediatype.Int_MediaTypeId
where mediatype.Int_MediaTypeId_FK == 1
&& mediaref.Bit_IsActive == true
&& media.Int_OrganizationId == 2
&& media.Int_PostStatusId != 3
&& mediaref.Int_MediaRefId == mediaref.Media.
MediaRefs.FirstOrDefault(m => m.Int_MediaId == media.Int_MediaId
&& m.Bit_IsActive == true &&
(m.Nvcr_MediaTitle != null
&& m.Nvcr_MediaTitle != "")).Int_MediaRefId
orderby media.Int_MediaId descending
select new MediaViewModel {
MediaId = media.Int_MediaId,
Mediatitle = mediaref.Nvcr_MediaTitle ,
Mediapath = mediaref.Vcr_MediaPath,
Slug = mediaref.Vcr_Slug,
Active = mediaref.Bit_IsActive
});
然后改为
var lst = (from mediaref in MediaRefs
join media in Medias
on mediaref.Int_MediaId equals media.Int_MediaId
join mediatype in MediaTypes on
media.Int_MediaTypeId equals mediatype.Int_MediaTypeId
where mediatype.Int_MediaTypeId_FK == 1
&& mediaref.Bit_IsActive == true
&& media.Int_OrganizationId == 2
&& media.Int_PostStatusId != 3
&& mediaref.Nvcr_MediaTitle != ""
group new {mediaref, Medias, MediaTypes} by new {
media.Int_MediaId,
mediaref.Vcr_MediaPath,
mediaref.Vcr_Slug,
mediaref.Bit_IsActive
} into g
orderby g.Key.Int_MediaId descending
select new MediaViewModel {
MediaId = Convert.ToInt64(g.Key.Int_MediaId),
Mediatitle = g.Min(p => p.mediaref.Nvcr_MediaTitle) == "" ?
g.Max(p => p.mediaref.Nvcr_MediaTitle) :
g.Min(p => p.mediaref.Nvcr_MediaTitle),
Mediapath = g.Key.Vcr_MediaPath,
Slug = g.Key.Vcr_Slug,
Active = g.Key.Bit_IsActive
});
这个查询可以用更有效的方式编写吗?问题是我想加入media
mediaref
的第一行,每行media
总共会有3行。有什么建议。在第一个查询中,我使用了FirstOrDefault
,在第二个查询中,我使用了group by
。
答案 0 :(得分:0)
我想我会去查询的第一个版本,但需要进行一些修改。有点像这样(我不打算写下这一切):
from m in Medias
where m.MediaType.Int_MediaTypeId_FK == 1
let firstmediaref = m.MediaRefs
.FirstOrDefault(ref => ref.Bit_IsActive
&& !string.IsNullOrEmpty(ref.Nvcr_MediaTitle))
并使用MediaViewModel
和m
构建您的firstmediaref
。