嵌套在Linq中选择顶部1

hre*_*000 3 .net c# sql linq

有一些问题想出这一个.

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)

Ami*_*ofi 7

确实可以这样做,它只会导致下面的一个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.

并不总是由开发人员决定数据库的结构,因此您可能必须坚持使用第一种方法并自己编写子选择.