如何合并(记住合并不合并!)这两个查询[关闭]

Posted

技术标签:

【中文标题】如何合并(记住合并不合并!)这两个查询[关闭]【英文标题】:How to merge (REMEMBER merge not combine!) these two queries [closed] 【发布时间】:2013-11-11 12:35:57 【问题描述】:

我有这两个 linq 查询:

var combo1 = from c in db.comments
             join p in db.picture on c.targetpictureid equals p.idpictures
             join u in db.users on c.iduser equals u.iduser
             select new TCommentDTO
             
                 idcomments=c.idcomments,
                 comment1 = c.comment1,
                 targetpictureid = c.targetpictureid,
                 ctime = c.ctime,
                 iduofpic=p.iduser,
                 iduofcommentor=c.iduser,
                 profilepicofcommentor=u.profilepic,
                 usernameofcommentor=u.username,
                 picFilename=p.picFilename,
                 picTitle=p.picTitle
             ;

var combo2 = from f in db.followers
             join u in db.users on f.iduser equals u.iduser
             select new TfollowerDTO
             
                idfollowers = f.idfollowers,
                iduser = f.iduser,
                targetiduser = f.targetiduser,
                startedfollowing = f.startedfollowing,
                unoffollower = u.username,
                ppoffollower = u.profilepic,
                status = u.status
             ;

我正在使用返回 JSON 的 Web API。我想合并这两个查询的输出。

我想重写此代码,使 cmets 和关注者数据应根据 ctimestartedfollowing 相对于时间进行合并(而不是合并)。如果用户有新评论,则评论应该排在第一位,如果关注者在前,关注者数据应该排在第一位。我不能使用 Union() 和 Concat() 因为首先两个类有不同的成员,其次我不想要两个要组合的 json 对象。

类似这样的:

 //comments data ,
 //follower data,
 //comments data ,
 //comments data ,
 //comments data ,
 //follower data

那么这个任务怎么做呢?

【问题讨论】:

你知道Union()吗? 是的,我确实知道 Union() 和 Concat(),但不能使用它们,因为首先这两个类有不同的成员,其次我不希望两个 json 对象组合在一起。 听起来你必须full outer join你的两个查询,但我不确定。 我认为连接不起作用 除了将它们打印出来并使用胶带外,我不明白这两个结果集如何相互关联......它们是否受众多userids 之一的约束? 【参考方案1】:

怎么样:

public class TDtoWrapper

    public DateTime SortKey get;set; 
    public Object Member get;set;



var result1 = from c in combo1
              select new TDtoWrapper  SortKey = c.ctime, Member = c 

var result2 = from c in combo2
              select new TDtoWraller  SortKey = c.startedfollowing, Member = c 

var result = result1.Concat(result2).Orderby(x => x.SortKey).Select(x => x.Member);

如果可以重写原始查询,则可以省略 Dto 类并编写

var combo1 = from c in db.comments
             join p in db.picture on c.targetpictureid equals p.idpictures
             join u in db.users on c.iduser equals u.iduser
             select new 
              
                SortKey = c.ctime, 
                Member = (object) new TCommentDTO
                
                  idcomments=c.idcomments,
                  comment1 = c.comment1,
                  targetpictureid = c.targetpictureid,
                  ctime = c.ctime,
                  iduofpic=p.iduser,
                  iduofcommentor=c.iduser,
                  profilepicofcommentor=u.profilepic,
                  usernameofcommentor=u.username,
                  picFilename=p.picFilename,
                  picTitle=p.picTitle
                 
             ;


var combo2 = ...

var result = from c in combo1.Concat(combo2)
             orderby c.SortKey
             select c.Member;

【讨论】:

我想你已经到了,让我试试…… 我在实施您的解决方案时遇到此错误,无法将类型“System.Linq.IQueryable”隐式转换为“System.Linq.IQueryable”。存在显式转换(您是否缺少演员表?) 解决了这个问题,现在出现运行时错误:DbUnionAllExpression requires arguments with compatible collection ResultTypes 不知道具体发生在哪里,但你可以试试somelinquery.Cast<object>()

以上是关于如何合并(记住合并不合并!)这两个查询[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何将这两个查询合并为一个?

mybatis查询结果如何合并为列表

如何将两个查询的结果合并到一个数据集中

Power Query:如何使电源查询更新合并文件?

在 SQL 中,如何在不使用大小写的情况下将两个查询合并为一个?

如何合并两个select mysql查询的结果[重复]