C# 嵌套选择Linq中的top 1

C# 嵌套选择Linq中的top 1,c#,.net,sql,linq,C#,.net,Sql,Linq,弄明白这件事有些困难 选择*,从鸡肉照片中选择前1名鸡肉,其中鸡肉=按[sort]编码订单作为鸡肉照片 代码是表中的一列 基本上是为这只鸡拍封面照 为了更清楚,我希望它从TableChicken返回多行。但只有一个条目来自chicken_照片 var q = from chicken in data.chickens join photos in data.chicken_photos on chicken.Code

弄明白这件事有些困难

选择*,从鸡肉照片中选择前1名鸡肉,其中鸡肉=按[sort]编码订单作为鸡肉照片

代码是表中的一列

基本上是为这只鸡拍封面照

为了更清楚,我希望它从TableChicken返回多行。但只有一个条目来自chicken_照片

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}              
你真的应该把你的问题更具体一些…

我想出来了

其实很明显,太明显了:

var q = from chicken in data.chickens
                where chicken.photographer_nr == nr && lang == chicken.Lang
                select new { chicken.photographer, chicken.Code, chicken.Title,Photo = (from b in data.chicken_photos where b.chicken==chicken.Code orderby b.Sort select b.Photograph_Nr).FirstOrDefault() };

这确实可以做到,这样它只会在下面生成一个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()
            };
如果您的表具有适当的主键和外键关系,并且在Entity Framework中具有适当的导航关联,那么您也可以通过以下方式获得相同的结果:

    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()
            };
最后,为了保持完全一致并仅使用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()
            }
        );
我更喜欢依赖实体导航,因为它迫使开发人员在实体框架中创建适当的导航关联,并在数据库中创建适当的外键关系。这几乎总是会导致下面的SQL优化


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

实际上,鸡农可以从中进行杂交,所以我想,是的。嗯,我想要多只鸡,所以我得到多行,但仅从chicken_photoTake1检索一个条目是多余的。First将返回序列中的第一个值,无论该序列包含一个或多个值。请注意,如果没有照片,它将抛出,如果要避免这种情况,请使用first或default。谢谢,我更新了答案以反映这一更好的做法,尽管在我的情况下,照片总是被填充,但不确定这是否是好的编码,如果查询返回100个条目,这意味着为selecttop1存储过程建立100个到数据库的连接可能是最好的选择。
    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()
            }
        );