C# Linq union无法连接超过2个结果集。仅用于连接到2个结果集

C# Linq union无法连接超过2个结果集。仅用于连接到2个结果集,c#,linq,C#,Linq,在我的程序中,我返回3个结果集: 1) resultImportResponse 2) 结果加载响应 3) 结果表 我正在检查,如果它们都不是空的,我想把它们合并成一个结果集 所以我声明var result=(动态)null 在我合并两个结果集的任何一个之前,它都可以正常工作 但是说如果我做了result=resultImportResponse.Union(resultAttach)//这很好用 但不管我得到什么结果,如果我尝试附加第三个结果集,它都会出错 result = resultImp

在我的程序中,我返回3个结果集:

1) resultImportResponse
2) 结果加载响应
3) 结果表

我正在检查,如果它们都不是空的,我想把它们合并成一个结果集

所以我声明
var result=(动态)null

在我合并两个结果集的任何一个之前,它都可以正常工作

但是说如果我做了
result=resultImportResponse.Union(resultAttach)//这很好用

但不管我得到什么结果,如果我尝试附加第三个结果集,它都会出错

result = resultImportResponse.Union(resultAttach); 
result = result.Union(resultUploadResponse);  //this gives error
见下面的示例

public JsonResult GetImportExportAttachmentLog(int doccode)
{

    List<RequestDetail> objImportExportLogs = null;

    objExportLogs = objProxyDownloadManager.GetDownloadRequestDetail(objRequestDetail);

    List<UploadRequest> objImportLogs = null;

    objImportLogs = objProxyUploadManager.GetUploadRequestDetail(objUploadRequestDetail);

    var resultImportResponse = (from i in objExportLogs
                                orderby i.RequestTime descending
                                select new
                                {

                                    Status = i.DownloadStatus.ToString(),
                                    ErrorMessage = i.ErrorLogDescription,
                                    FileId = i.FileId,
                                    FileUri = i.FileUri,
                                    FileName = i.FileName,
                                    IsDownload = i.DownloadStatus.ToString().TrimEnd() == "Complete" ? true : false
                                });

    var resultUploadResponse = (from i in objImportLogs
                                orderby i.RequestStartTime descending
                                select new
                                {
                                    Status = i.UploadStatus.ToString(),
                                    ErrorMessage = i.ErrorLogDescription,
                                    FileId = i.FileId,
                                    FileUri = i.FileUri,
                                    FileName = i.FileName,
                                    IsUpload = i.UploadStatus.ToString().TrimEnd() == "Complete" ? true : false
                                });

    //For Attachment,Start Here
    List<RequestDetail> objAttachImportExportLogs = null;
    objAttachLogs = objProxyDownloadManager.GetDownloadRequestDetail(objAttachRequestDetail);

    var resultAttach = (from i in objAttachImportExportLogs
                        orderby i.RequestTime descending
                        select new
                        {
                            Status = i.DownloadStatus.ToString(),
                            ErrorMessage = i.ErrorLogDescription,
                            FileId = i.FileId,
                            FileUri = i.FileUri,
                            FileName = i.FileName,
                            IsDownload = i.DownloadStatus.ToString().TrimEnd() == "Complete" ? true : false
                        });
    //For Attachment,Ends Here

    var result = (dynamic)null;


    if ((!Equals(resultImportResponse, null) && !Equals(resultAttach, null) && !Equals(resultUploadResponse, null)) && (resultImportResponse.Count() > 0 && resultAttach.Count() > 0 && resultUploadResponse.Count() > 0))
    {
        result = resultImportResponse.Union(resultAttach);
        // result = result.Union(resultUploadResponse);
        result = Enumerable.Union(result, resultUploadResponse);
    }
    else if (!Equals(resultImportResponse, null) && resultImportResponse.Count() > 0)
    {
        result = resultResponse;
    }
    else if (!Equals(resultAttach, null) && resultAttach.Count() > 0)
    {
        result = resultAttach;
    }
    else if (!Equals(resultUploadResponse, null) && resultUploadResponse.Count() > 0)
    {
        result = resultUploadResponse;
    }
    return Json(result);
    }
public JsonResult getimportextortattachmentlog(int-doccode)
{
List objImportExportLogs=null;
objExportLogs=objProxyDownloadManager.GetDownloadRequestDetail(objRequestDetail);
List-objImportLogs=null;
objImportLogs=objProxyUploadManager.GetUploadRequestDetail(objUploadRequestDetail);
var resultImportResponse=(来自objExportLogs中的i)
orderby i.RequestTime递减
选择新的
{
Status=i.DownloadStatus.ToString(),
ErrorMessage=i.ErrorLogDescription,
FileId=i.FileId,
FileUri=i.FileUri,
FileName=i.FileName,
IsDownload=i.DownloadStatus.ToString().TrimEnd()=“完成”?真:假
});
var resultUploadResponse=(来自objImportLogs中的i)
orderby i.RequestStartTime递减
选择新的
{
Status=i.UploadStatus.ToString(),
ErrorMessage=i.ErrorLogDescription,
FileId=i.FileId,
FileUri=i.FileUri,
FileName=i.FileName,
IsUpload=i.UploadStatus.ToString().TrimEnd()=“完成”?真:假
});
//附件,从这里开始
列表objattachiportexportlogs=null;
objAttachLogs=objProxyDownloadManager.GetDownloadRequestDetail(objAttachRequestDetail);
var resultatach=(来自objattachiportexportlogs中的i)
orderby i.RequestTime递减
选择新的
{
Status=i.DownloadStatus.ToString(),
ErrorMessage=i.ErrorLogDescription,
FileId=i.FileId,
FileUri=i.FileUri,
FileName=i.FileName,
IsDownload=i.DownloadStatus.ToString().TrimEnd()=“完成”?真:假
});
//附件到此结束
var result=(动态)null;
如果(!Equals(resultImportResponse,null)&&&!Equals(resultAttach,null)&&!Equals(resultUploadResponse,null))&&&(resultImportResponse.Count()>0&&resultAttach.Count()>0&&resultUploadResponse.Count()>0))
{
结果=resultImportResponse.Union(resultAttach);
//结果=result.Union(resultUploadResponse);
结果=可枚举的.Union(结果,resultUploadResponse);
}
如果(!Equals(resultImportResponse,null)&&resultImportResponse.Count()>0),则为else
{
结果=结果响应;
}
如果(!Equals(resultAttach,null)&&resultAttach.Count()>0,则为else)
{
结果=结果附件;
}
如果(!Equals(resultUploadResponse,null)&&resultUploadResponse.Count()>0),则为else
{
结果=resultUploadResponse;
}
返回Json(结果);
}

我认为这是因为您试图从同一个对象开始合并的两个对象(或者至少它们都是匿名类型,具有字段
状态、错误消息、文件ID、文件URI、文件名、IsDownload
)-我目前无法测试这一点,所以我可能是错的,但我可以合理地确定情况确实如此。另一方面,您的
resultUploadResponse
是另一种类型(well包含
IsUpload
字段,而不是
IsDownload
字段。)

要修复它,需要所有的
IEnumerable
s属于同一类。。因此,创建一些类,例如:

public class Result {
    public string Status;
    public string ErrorMessage;
    public string FileId; //Maybe int? can't tell from your code
    public string FileUri;
    public string FileName;
    public bool IsDownload;
    public bool IsUpload;
}
然后你的LINQ应该是,例如:

var resultUploadResponse = (from i in objImportLogs
                            orderby i.RequestStartTime descending
                            select new Result
                            {
                                Status = i.UploadStatus.ToString(),
                                ErrorMessage = i.ErrorLogDescription,
                                FileId = i.FileId,
                                FileUri = i.FileUri,
                                FileName = i.FileName,
                                IsUpload = i.UploadStatus.ToString().TrimEnd() == "Complete";
                            });
并对所有这些进行类似的更改:)

此外,在本例中,
Union
Concat
LINQ语句将执行相同的操作,从概念上讲,您正在执行
Concat
,因此您可能应该使用该函数:)

或者: 当您想要使用
dynamic
s时,您可以对dynamics执行相同的操作,但是单个元素需要是动态的,而不是
result
变量,因此如果您想要避免强键入
result
类,您可以执行以下操作:

var resultUploadResponse = (from i in objImportLogs
                            orderby i.RequestStartTime descending
                            select (dynamic) new
                            {
                                Status = i.UploadStatus.ToString(),
                                ErrorMessage = i.ErrorLogDescription,
                                FileId = i.FileId,
                                FileUri = i.FileUri,
                                FileName = i.FileName,
                                IsUpload = i.UploadStatus.ToString().TrimEnd() == "Complete";
                            });

与其他方法类似。

您是否查看了
Enumerable.Join()
方法也许这是您真正需要的。是的,要使联合处理匿名类型,所有属性都必须相同。