问题描述
我现在有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就知道为什么了