高分求一条linq语句写法

问题描述

我现在有Img表,这里存放的是好几个表所使用的图片路径,其中Img表中用字段FID代表这关联几张表的主键ID现在我有张产品表Product,里面存放的产品图片就是在IMG表中存放,还有个产品评论表Comments其中我在product的模型中已经定义好与comment表的关联,但是没有定义与img表关联现在我想通过产品ID查询产品数据的同时,在返回数据字段中包括评论表的最新前10条数据,还有img表的产品图片现在这是我的linq语句写法,(frompindb.Productsjoinimgindb.Imgsonp.idequalsimg.fidwherep.id==pidselectnew{p.id,p.name,p.price,commtentlist=p.CommentList.Count>10?p.CommentList.OrderByDescending(c=>c.id).Take(10).ToList():p.CommentList,//在模型中已经定义好与Comment关联,现在想法是,如果评论超过10条,就取最近评论的前10条,否则返回全部评论imglist=u,//这是我想取到的产品图片列表,想在这里直接返回一个list}).ToList();

但是这个写法会出错,出错的是在commentlist这里,出现报错不识别方法“System.Collections.Generic.List如果注释掉的化,不会出错,但是会出现,重复数据,就是如果img有3个,就出现3条重复的product数据,现在想求各位这条能够实现我想法的linq语句怎么写

解决方案

解决方案二:
没必要tolist,然后判断大于10也没必要,直接take(10)就可以
解决方案三:
从来不用LINQ查数据库,因为既难写又难看又难改,还是SQL语句最好用.
解决方案四:
引用1楼starfd的回复:

没必要tolist,然后判断大于10也没必要,直接take(10)就可以

直接take报错Subqueryreturnsmorethan1row
解决方案五:
产品表和图片表使用左连接(leftjoin),类似下面的代码,纯手打,可能有错误。db.Products.Include(x=>x.CommentList).GroupJoin(db.Imgs,x=>x.id,x=>x.fid,(p,i)=>{new{product=p,images=i}})

解决方案六:
没看到你的那个U是中哪定义的
解决方案七:
commtentlist=p.CommentList.Count>10?p.CommentList.OrderByDescending(c=>c.id).Take(10).ToList():p.CommentList,//在模型中已经定义好与Comment关联,现在想法是,如果评论超过10条,就取最近评论的前10条,否则返回全部评论这个去掉再之前的结果集取出varproductIds=query.Select(n=>n.Id);然后foreach一个一个从评论表取吧商品和评论没必要一起查出来的
解决方案八:
商品和图片是一对多的就不要用Join了先取出商品然后再取商品图然后再取商品评论就Ok了没必要join
解决方案九:
引用5楼q107770540的回复:

没看到你的那个U是中哪定义的

u是上面的joinimgindb.Imgsonp.idequalsimg.fid

里面的img没注意改。。
解决方案十:
引用7楼zhuankeshumo的回复:

商品和图片是一对多的就不要用Join了先取出商品然后再取商品图然后再取商品评论就Ok了没必要join

同时取出来和分别取出来,哪个性能上更优些?
解决方案十一:
(frompindb.Productsjoinimgindb.Imgsonp.idequalsimg.fidintogwherep.id==pidselectnew{p.id,p.name,p.price,commtentlist=p.CommentList.Any()?p.CommentList.OrderByDescending(c=>c.id).Take(10).ToList():NULL,imglist=g.ToList()}).ToList();

解决方案十二:
引用9楼zbc496218的回复:

Quote: 引用7楼zhuankeshumo的回复:
商品和图片是一对多的就不要用Join了先取出商品然后再取商品图然后再取商品评论就Ok了没必要join

同时取出来和分别取出来,哪个性能上更优些?

不一定哪个快(要是正常索引的情况同时的快)随着业务的拆分到最后都是走的cache都是一个个取出来的
解决方案十三:
这个换个思路吧,分两次查,查出来后组合成一个
解决方案十四:
引用10楼q107770540的回复:

(frompindb.Productsjoinimgindb.Imgsonp.idequalsimg.fidintogwherep.id==pidselectnew{p.id,p.name,p.price,commtentlist=p.CommentList.Any()?p.CommentList.OrderByDescending(c=>c.id).Take(10).ToList():NULL,imglist=g.ToList()}).ToList();

道友这个方式查询报错,错误如下:System.NotSupportedException:LINQtoEntities不识别方法“System.Collections.Generic.List`1错误就是在commentlist和g.ToList()如果都注销了没问题
解决方案十五:
引用11楼zhuankeshumo的回复:

Quote: 引用9楼zbc496218的回复:
Quote: 引用7楼zhuankeshumo的回复:
商品和图片是一对多的就不要用Join了先取出商品然后再取商品图然后再取商品评论就Ok了没必要join

同时取出来和分别取出来,哪个性能上更优些?

不一定哪个快(要是正常索引的情况同时的快)随着业务的拆分到最后都是走的cache都是一个个取出来的

soga,那我还是看看尽量选择同时取
解决方案:
(frompindb.Products.AsEnumerable()joinimgindb.Imgs.AsEnumerable()onp.idequalsimg.fidintogwherep.id==pidselectnew{p.id,p.name,p.price,commtentlist=p.CommentList.Any()?p.CommentList.OrderByDescending(c=>c.id).Take(10).ToList():NULL,imglist=g.ToList()}).ToList();
解决方案:
觉得#15楼的写法应该可以楼主可以看看这段linq生成的sql就知道为什么了

时间: 2024-10-26 20:22:06

高分求一条linq语句写法的相关文章

求一条sql语句,单表查询的

问题描述 求一条sql语句,单表查询的 表结构 (姓名,课程,成绩) 现在求获的该表总成绩最高学员的名字 解决方案 mysql 数据库select sum(成绩) as t from table group by 姓名 order by t limit 0,1 oracle数据库 select * from (select sum(成绩) as t from table group by 姓名 order by t) WHERE ROWNUM<=1 sqlserver数据库 select top

数据-求教一条SQL语句实现功能的问题

问题描述 求教一条SQL语句实现功能的问题 (第一遍问的有写不对) SQL语句是否可以实现这样的功能: (设有表A.B,A中有数据f1和f2) select f1 from A where f2='aa'; 当f1=1时,执行SELECT 语句1 当f1=2时,执行select语句2 这样的话如何实现? 解决方案 select * from 表A where exists(select 1 from 表C WHERE 表C.字段=1) union select * from 表B where e

求一条SQL语句,高手救救(对不起,最近问得多,分数不足了!)

问题描述 我想要做的是多张打印的功能比如:2张表如下表一IDNAME001订购单002采购单003申请单004请购单表二piditemdes0011订购电脑0012订购手机0013订购书0021采购某某0022采购鞋0023采购用品003...........004......一对多的关系现在我的dataGridView里面放的是第一张表的数据,现在我要根据我选中的单(可以多选!)打印它的子项,就是选中001就打印表二的所有001打印成一张A4纸,如果选择一个打印就简单,如果多选的话,要怎么分呢

水晶报表打印!高手救救!急用!分数还有30,在求一条SQL语句那贴答,刚刚发错标题!

问题描述 我想要做的是多张打印的功能比如:2张表如下表一IDNAME001订购单002采购单003申请单004请购单表二piditemdes0011订购电脑0012订购手机0013订购书0021采购某某0022采购鞋0023采购用品003...........004......一对多的关系现在我的dataGridView里面放的是第一张表的数据,现在我要根据我选中的单(可以多选!)打印它的子项,就是选中001就打印表二的所有001打印成一张A4纸,如果选择一个打印就简单,如果多选的话,要怎么分呢

求一条SQL语句

问题描述 表A(id,name)1 tom2 jim3 zz21 tt41 ss表B(id,relation)1 1,32 2,41表B中的relation存的是A表中的id值的组合,A,B表中id均为int型的主键期望获得表A的结果为:id name21 tt即期望获得在A表中存在而在B表中的relation列中不存在的记录 问题补充:mavlarn 写道 解决方案 谢谢楼上指正,呵呵,当时没考虑太多,其实思路是一样的,改一下:SELECT A.* FROM AWHERE NOT EXISTS

sql server-求一条sql语句 sqlserver数据库

问题描述 求一条sql语句 sqlserver数据库 刷卡表,有ID,刷卡时间.时间等并和用户表形成多对一关系,使用的是sqlserver. 我要取得是"昨天,每个用户的最大刷卡时间和最小刷卡时间的刷卡数据". 我的SQL不是很好,昨天.最大刷卡时间和最小都能搞出来,但是加个每个用户就乱了: 因为每个用户都可能会有多条刷卡数据. ...求解 解决方案 select b.username, max(刷卡时间) 最大刷卡时间, min(刷卡时间) 最小刷卡时间 from 刷卡表 a inn

string-这条java语句也很复杂,求解析

问题描述 这条java语句也很复杂,求解析 SimpleAdapter adapter = new SimpleAdapter(this, getTripListData(),R.layout.listviewrow, new String[] { "img", "name", "money","zhe" }, new int[] { R.id.tripImg, R.id.phoneName,R.id.phoneMoney,

把这四条sql语句从sqlsever变成oracle的sql语句,求帮忙

问题描述 把这四条sql语句从sqlsever变成oracle的sql语句,求帮忙 1C 1.SELECT top 1 MENUID+1 from app_menu ORDER BY CAST(MENUID AS int) desc 2.SELECT top 1 idfileNamefilePathcreateTimemd5fileSize FROM VIS_file WHERE md5=#md5# 3. SELECT top 1 USERIDREALNAMEGENDEROTELOEMAILQQ

sql查询-求帮忙优化我这条sql语句

问题描述 求帮忙优化我这条sql语句 首先说一下下面sql语句要用到的表的基本情况: 一.有三张表,一张叫equipment,一张叫sensor,一张叫sensorInputData 二.三表关系是equipment下有多个sensor,sensor下有多个sensorInputdata,所以sensor下有一个equipment的主键quipmentId做外键,sensorInputData下也有一个sensor的主键sensorId做外键,其他都是各自表的属性,应该能比较清晰的看出来 下面是