有一些问题想出这一个.
select*,(从chicken_photo选择top1 chicken_nr,其中鸡=代码顺序为[sort])作为Chicken的照片
代码是Table Chicken中的一列
基本上得到这只鸡的封面照片.
为了更清楚,我希望它从表Chicken返回多行.但只有一个来自chicken_photo的条目.
var q = from chicken in data.chickens
join photos in data.chicken_photos
on chicken.Code equals photos.chicken
where chicken.Lang==lang && chicken.photographer_nr == nr
group chicken by new {chicken.photographer,photos.Photograph_Nr,chicken.Title,chicken.Code}
Run Code Online (Sandbox Code Playgroud)
确实可以这样做,它只会导致下面的一个SQL查询.
如果您执行了针对实体框架编写的子选择,则Linq查询将成为单个SQL查询.
var q = from chicken in data.chickens
where chicken.photographer_nr == nr && chicken.Lang == lang
select new
{
chicken.photographer,
chicken.Code,
chicken.Title,
Photo = (from cp in data.chicken_photos
where cp.chicken == chicken.Code
orderby cp.Sort
select cp.Photograph_Nr).FirstOrDefault()
};
Run Code Online (Sandbox Code Playgroud)
如果您的表具有正确的主键和外键关系,以及实体框架中正确的导航关联,那么您也可以通过这种方式获得相同的结果:
var q = from chicken in data.chickens
where chicken.photographer_nr == nr && chicken.Lang == lang
select new
{
chicken.photographer,
chicken.Code,
chicken.Title,
Photo = c.chicken_photos.Select(cp => cp.Photograph_Nr).FirstOrDefault()
};
Run Code Online (Sandbox Code Playgroud)
最后,保持完全一致并仅使用lambda表达式:
var q = data.chickens
.Where(c => chicken.photographer_nr == nr && chicken.Lang == lang)
.Select(c => new
{
c.photographer,
c.Code,
c.Title,
Photo = c.chicken_photos.Select(cp => cp.Photograph_Nr).FirstOrDefault()
}
);
Run Code Online (Sandbox Code Playgroud)
我更喜欢依赖实体导航,因为它迫使开发人员在Entity Framework中创建适当的导航关联以及在数据库中创建适当的外键关系.这几乎总会导致下面的优化SQL.
并不总是由开发人员决定数据库的结构,因此您可能必须坚持使用第一种方法并自己编写子选择.
| 归档时间: |
|
| 查看次数: |
7297 次 |
| 最近记录: |