我可能没有使用正确的术语“嵌套”,但是您可以看到下面的2个类。 IEnumerable<OperationTask>
在IEnumerable<AxApp>
中。
我希望我能正确解释这一点:
我有一种方法可以将txt文件中的值读入字符串[]
string[] appNames = _appNamesRepository.GetAppNameListFromInputFile(fileName);
然后,我使用一种方法创建一个IEnumerable<AxApp>
集合,该方法读取SQL表并为txt文件中的每个应用程序值返回AxApp属性。
IEnumerable<AxApp> allAxApps = _axAppRepository.GetAllAxAppsInList(appNames);
我需要根据特定标准从IEnumerable<AxApp>
中的值中过滤IEnumerable<OperationTask>
集合。我可以得到一个基本的lambda搜索,但是如果我有多个基于此的值,则无法返回正确的结果。
例如,如果appid,operationType和operationStatus.Incomplete不在IEnumerable<AxApp>
中,则以下内容仅返回IEnumerable<OperationTasks>
。
var test = allAxApps.Where(app =>
!app.operationTasks
.Any(task => task.appId == app.appid &&
task.operationType == operationType &&
task.operationStatus != Status.Incomplete));
但是,我需要更进一步,如果operationType ==“ Differential”,我只能返回AxApp IF IN IEnmerable<OperationTask>
,其中有一个collection,其中type =“ NewConversion”,状态为=“ Complete”,但没有type =“ Finish”,但可以包含类型=“ Differential”
public class AxApp
{
public AxApp()
{
}
public AxApp(int id, string appname, string dlname)
{
this.appname = appname;
appid = id;
this.dlname = dlname;
}
public string appname { get; set; }
public int appid { get; set; }
public string dlname { get; set; }
public string dtname { get; set; }
public int flags { get; set; }
public IEnumerable<AxDlsd> dlsdRecords { get; set; }
public IEnumerable<AxDl> dlRecords { get; set; }
public IEnumerable<OperationTask> operationTasks { get; set; }
public DateTime startMerge { get; set; }
public DateTime endMerge { get; set; }
}
public class OperationTask
{
public int operationId { get; set; }
public int appId { get; set; }
public OperationType operationType { get; set; }
public Status operationStatus { get; set; }
public DateTime startTime { get; set; }
public DateTime endTime { get; set; }
}
从字符串中的任何值返回AppData的方法[]
public IEnumerable<AxApp> GetAllAxAppsInList(string[] appNamesInput)
{
string query = @"SELECT appid, appname, dlname, dtname, flags FROM dbo.ae_apps WHERE appname = @_appname";
string opQuery = @"SELECT operationId, appId, operationType, operationStatus, startTime, endTime FROM dbo.RDS_ConversionOperationsHistory WHERE appid = @_appId";
using (var connection = _dbConnectionFactory.GetAxDbConnection())
{
foreach (string appname in appNamesInput)
{
AxApp result = connection.QuerySingle<AxApp>(query, new { _appname = appname });
result.operationTasks = connection.Query<OperationTask>(opQuery, new { _appId = result.appid });
yield return result;
}
}
}
IEnumerable for AxApp / OperationTask
[0] = {RDS.Conversion.UtilityLibrary.Models.AxApp}
[0] {RDS.Conversion.UtilityLibrary.Models.AxApp} RDS.Conversion.UtilityLibrary.Models.AxApp
appid 1 int
appname "PLIC_CENT_1" string
dlRecords null System.Collections.Generic.IEnumerable<RDS.Conversion.UtilityLibrary.Models.AxDl
dlname "ae_dlsd1_SIM" string
dlsdRecords null System.Collections.Generic.IEnumerable<RDS.Conversion.UtilityLibrary.Models.AxDlsd>
dtname "ae_dt1" string
endMerge {1/1/0001 12:00:00 AM} System.DateTime
flags 16384 int
operationTasks Count = 3 System.Collections.Generic.IEnumerable<RDS.Conversion.UtilityLibrary.Models.OperationTask> {System.Collections.Generic.List<RDS.Conversion.UtilityLibrary.Models.OperationTask>}
startMerge {1/1/0001 12:00:00 AM} System.DateTime
operationTasks Count = 3 System.Collections.Generic.IEnumerable<RDS.Conversion.UtilityLibrary.Models.OperationTask> {System.Collections.Generic.List<RDS.Conversion.UtilityLibrary.Models.OperationTask>}
[0] {RDS.Conversion.UtilityLibrary.Models.OperationTask} RDS.Conversion.UtilityLibrary.Models.OperationTask
appId 1 int
endTime {1/1/0001 12:00:00 AM} System.DateTime
operationId 18 int
operationStatus Complete RDS.Conversion.UtilityLibrary.Models.Status
operationType NewConversion RDS.Conversion.UtilityLibrary.Models.OperationType
startTime {9/28/2018 12:53:51 PM} System.DateTime
答案 0 :(得分:1)
我不确定这是否是您要寻找的东西,但是,它可能会带您正确的方向。
test = allAxApps.Where(app =>
{
var tasks = app.operationTasks.ToList();
var differentialCondition = false;
if (operationType == OperationType.Differential)
{
var hasCompletedNewConversion = tasks.Any(task =>
task.operationType == OperationType.NewConversion &&
task.operationStatus == Status.Complete);
var hasFinish = tasks.Any(task => task.operationType == OperationType.Finish);
differentialCondition = hasCompletedNewConversion && !hasFinish;
}
var hasIncomplete = tasks.Any(task =>
task.appId == app.appid &&
task.operationType == operationType &&
task.operationStatus == Status.Incomplete);
return differentialCondition && !hasIncomplete;
});