C# Linq union无法连接超过2个结果集。仅用于连接到2个结果集
在我的程序中,我返回3个结果集: 1) resultImportResponseC# Linq union无法连接超过2个结果集。仅用于连接到2个结果集,c#,linq,C#,Linq,在我的程序中,我返回3个结果集: 1) resultImportResponse 2) 结果加载响应 3) 结果表 我正在检查,如果它们都不是空的,我想把它们合并成一个结果集 所以我声明var result=(动态)null 在我合并两个结果集的任何一个之前,它都可以正常工作 但是说如果我做了result=resultImportResponse.Union(resultAttach)//这很好用 但不管我得到什么结果,如果我尝试附加第三个结果集,它都会出错 result = resultImp
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()
方法也许这是您真正需要的。是的,要使联合处理匿名类型,所有属性都必须相同。