在我的程序中,我返回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);
}
答案 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";
});
并对所有这些进行类似的改变:)。
此外,虽然在这种情况下,Union
和Concat
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";
});
和其他的类似。