Linq union无法连接超过2个结果集。只能连接到2个结果集

时间:2014-09-15 21:31:20

标签: c# linq

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

1)resultImportResponse
2)resultUploadRespsone
3)resultAttach

我正在检查如果所有这些都不为null,我想将它们连接成一个结果集。

所以我声明了var result = (dynamic)null;

在我合并2个结果集之前,它可以正常工作。

但是如果我做result = resultImportResponse.Union(resultAttach); //this works fine

但是如果我尝试追加第三个结果集,那么无论我得到什么结果都会给出错误

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);
    }

1 个答案:

答案 0 :(得分:1)

我相信这是因为你试图联合开始的两个是同一个对象(或者至少它们都是带有字段Status, ErrorMessage, FileId, FileUri, FileName, IsDownload的匿名类型) - 我现在无法测试这个,所以我可能错了,但我有理由相信这是事实。另一方面,您的resultUploadResponse属于不同类型(包含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";
                            });

并对所有这些进行类似的改变:)。

此外,虽然在这种情况下,UnionConcat LINQ语句将执行相同的操作,从概念上讲,您正在执行Concat,所以也许您应该使用该函数:)

可替换地:

如果你想使用dynamic,你可以对动态做同样的事情,但是单个元素需要是动态的,而不是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";
                            });

和其他的类似。