首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq中嵌套的select top 1

Linq中嵌套的select top 1
EN

Stack Overflow用户
提问于 2010-07-17 16:46:38
回答 3查看 8.2K关注 0票数 4

在解决这个问题上有一些问题。

select *,(select top 1 chicken_nr from chicken_photo where code =code order by sort)作为来自鸡的照片

代码是表鸡中的一列

基本上就是拿到这只鸡的封面照片。

为了更清楚起见,我想让它从表鸡返回多个行。但只有一个来自chicken_photo的条目。

代码语言:javascript
复制
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}              
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-25 04:09:59

这确实可以这样做,使得它只在下面产生一个SQL查询。

如果您像针对实体框架编写的那样执行子选择,那么Linq查询将成为单个SQL查询。

代码语言:javascript
复制
    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()
            };

如果您的表具有适当的主键和外键关系,并且在实体框架中具有适当的导航关联,那么您也可以通过以下方式获得相同的结果:

代码语言:javascript
复制
    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表达式:

代码语言:javascript
复制
    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。

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

票数 8
EN

Stack Overflow用户

发布于 2010-07-17 17:17:10

我想通了。

非常明显,实际上,太明显了:)

代码语言:javascript
复制
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() };
票数 3
EN

Stack Overflow用户

发布于 2010-07-17 16:49:48

代码语言:javascript
复制
var photo = (from c in chicken_photo where c.code = chicken orderby c.sort select c.chicken_nr).Take(1).SingleOrDefault();

你真的应该更充实你的问题...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3270843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档