C# 将DataTable中的2列与列表中的2列进行比较,并使用特定条件构建一个新列表

C# 将DataTable中的2列与列表中的2列进行比较,并使用特定条件构建一个新列表,c#,linq,C#,Linq,我有DataTable publicstaticdatatable子项目=newdatatable(); 公共静态数据表GetSubProjects { 获取{返回子项目;} } 它来自数据库,所以列如下 选择ProjectN、ProjectSubN、ProjectM 并列出: 公共类子项目列表 { 公共字符串ProjectNumber{get;set;} 公共字符串子项目编号{get;set;} 公共字符串子项目名称{get;set;} 公共字符串项目管理器{get;set;} publi

我有
DataTable

publicstaticdatatable子项目=newdatatable();
公共静态数据表GetSubProjects
{
获取{返回子项目;}
}
它来自数据库,所以列如下

选择ProjectN、ProjectSubN、ProjectM
并列出:

公共类子项目列表
{
公共字符串ProjectNumber{get;set;}
公共字符串子项目编号{get;set;}
公共字符串子项目名称{get;set;}
公共字符串项目管理器{get;set;}
public int ObjectID{get;set;}
公共子项目列表(字符串项目编号、字符串子项目编号、字符串子项目名称、字符串项目管理器、int ObjectID)
{
this.ProjectNumber=项目编号;
this.SubProjectNumber=SubProjectNumber;
this.SubProjectName=SubProjectName;
this.ProjectManager=ProjectManager;
this.SubProjectNumber=SubProjectNumber;
this.ObjectID=ObjectID;
}
}
public static List DeliverySubProjectList=new List();
最终我想把所有的结果都放到新的列表里

ProjectN + ProjectSubN (DataTable) = ProjectNumber + SubProjectNumber (List) && 
ProjectM (DataTable) != ProjectManager (List)
作为输出,我需要获得
ProjectNumber
子项目编号
ProjectM
ProjectManager
。基本上,我需要捕获与一个子项目不匹配的
ProjectM
ProjectManager
。我本来可以这样做的

var SubProjectResult=SubProjects.AsEnumerable()
.Where(x=>DeliverySubProjectList.Any(y=>
y、 ProjectNumber.Trim()+y.SubProjectNumber==x.Field(“ProjectN”).Trim()+x.Field(“ProjectSubN”).Trim()&&
!string.Equals(y.ProjectManager.Trim(),x.Field(“ProjectM”).Trim(),StringComparison.CurrentCultureIgnoreCase)))
.选择(x=>new
{
ProjectN=x.字段(“ProjectN”),
ProjectN=x.字段(“ProjectSubN”),
ProjectM=x.字段(“ProjectM”),
ProjectM=x.ProjectManager//这是不可能的
})
.OrderBy(o=>o.ProjectN).ToList();
但是

ProjectM=x.ProjectManager//这是不可能的
是错误的,无法编译。因此,我无法从列表中获取
ProjectManager
,其中
ProjectN+ProjectSubN(DataTable)=ProjectNumber+SubProjectNumber(List)
匹配,但ProjectManager不匹配。我需要先将数据表和列表合并在一起吗?我试过这个

var myList1 = SubProjects.AsEnumerable().Concat(DeliverySubProjectList).ToList();
但是有一个错误

严重性代码说明项目文件行抑制状态 错误CS1929“EnumerablerRowCollection”不包含 “Concat”的定义和最佳扩展方法重载 “可查询的。可查询的”, IEnumerable)“”需要类型为的接收器 “IQueryable”


我想这应该是你想要的。您可能需要添加额外的空检查,我也不太确定您希望如何从列表和数据表中添加字符串值:

public class ResultModel
        {
            public string ProjectNumber { get; set; }
            public string SubProjectNumber { get; set; }
            public string ProjectM { get; set; }
            public string ProjectManager { get; set; }
        }

...
...
static void Main(string[] args)
        {
            List<SubProjectsList> DeliverySubProjectList = // populate list
            DataTable SubProjects = // populate datatable
            List<ResultModel> results = GetResults(DeliverySubProjectList, SubProjects).ToList();
        }

        private static IEnumerable<ResultModel> GetResults(List<SubProjectsList> DeliverySubProjectList, DataTable SubProjects)
        {
            return SubProjects.AsEnumerable().Select(row =>
            {
                var listItem = DeliverySubProjectList.FirstOrDefault(item =>
                {
                    return item.ProjectNumber + item.SubProjectNumber == row["ProjectN"].ToString() + row["ProjectSubN "].ToString()
                        && !item.ProjectManager.Equals(row["ProjectM"].ToString());

                });

                if (listItem != null)
                {
                    return new ResultModel
                    {
                        ProjectNumber = row["ProjectN"].ToString(),
                        SubProjectNumber = listItem.SubProjectNumber,
                        ProjectM = row["ProjectM"].ToString(),
                        ProjectManager = listItem.ProjectManager
                    };
                }
                else
                {
                    return null;
                }
            })
            .Where(res => res != null);
        }
公共类结果模型
{
公共字符串ProjectNumber{get;set;}
公共字符串子项目编号{get;set;}
公共字符串ProjectM{get;set;}
公共字符串项目管理器{get;set;}
}
...
...
静态void Main(字符串[]参数)
{
列表交付子项目列表=//填充列表
DataTable子项目=//填充DataTable
List results=GetResults(DeliverySubProjectList,SubProjects).ToList();
}
私有静态IEnumerable GetResults(列表交付子项目列表、数据表子项目)
{
return SubProjects.AsEnumerable().Select(行=>
{
变量listItem=DeliverySubProjectList.FirstOrDefault(项=>
{
return item.ProjectNumber+item.SubProjectNumber==行[“ProjectN”].ToString()+行[“ProjectSubN”].ToString()
&&!item.ProjectManager.Equals(行[“ProjectM”].ToString());
});
如果(listItem!=null)
{
返回新的结果模型
{
ProjectNumber=行[“ProjectN”]。ToString(),
SubProjectNumber=listItem.SubProjectNumber,
ProjectM=行[“ProjectM”]。ToString(),
ProjectManager=listItem.ProjectManager
};
}
其他的
{
返回null;
}
})
。其中(res=>res!=null);
}

谢谢您!似乎它可以解决我的问题,但你也可以添加使用示例。我不太确定如何实现这个列表创建方法<代码>列表子项目numberlist=新列表();SubProjectNumberList=NewMethod(DeliverySubProjectList,SubProjects)