简体   繁体   English

带有linq表达式的数据表的左外部联接?

[英]Left outer join of datatable with linq expression?

I have two DataTable s: 我有两个DataTable

DataTable dtFields = new DataTable("tmpFieldTable");                
dtFields.Columns.Add("FieldID");
dtFields.Columns.Add("CDGroupID");
dtFields.Columns.Add("CDCaption");
dtFields.Columns.Add("fldIndex");

and

DataTable dtCDGroup = new DataTable("tmpCDGroup");               
dtCDGroup.Columns.Add("CDGroupID");
dtCDGroup.Columns.Add("Name");
dtCDGroup.Columns.Add("Priority");

I am using following LINQ expression to join these tables: 我正在使用以下LINQ表达式来联接这些表:

var resultList = dtFields.AsEnumerable()
                         .Join(dtCDGroup.AsEnumerable(),
                               fieldList => fieldList.Field<string>("CDGroupID"),
                               cd => cd.Field<string>("CDGroupID"),
                               (fieldList, cd) => new
                               {
                                   FieldID = fieldList.Field<string>("FieldID"),
                                   CdGroup = cd.Field<string>("Name"),
                                   CDCaption = fieldList.Field<string>("CDCaption"),
                                   Priority = (cd.Field<string>("Priority") ?? "99"),
                                   fldIndex = fieldList.Field<string>("fldIndex").ToString()
                               })
                         .OrderBy(result => result.Priority)
                         .ThenBy(result => result.fldIndex);

How can I perform left outer join with these DataTable s? 如何使用这些DataTable执行左外部DataTable

Left join are not natively offered using lambda expression. 左联接不是本地使用lambda表达式提供的。 but you can achieve this using GroupJoin and SelectMany method. 但是您可以使用GroupJoin和SelectMany方法来实现。

var result = new string[] { "A", "B" }.GroupJoin(new string[] { "B" }, l => l, r => r, (l, r) => new { l, r }).ToList();
            Console.WriteLine(result.Count());

this will result result[0].r.Count() = 0 and result[1].r.Count() = 1. 这将导致result [0] .r.Count()= 0和result [1] .r.Count()= 1。

Hope this will help. 希望这会有所帮助。

Regards. 问候。

Just add DefaultIfEmpty() to your table: 只需将DefaultIfEmpty()添加到表中:

resultList = dtFields.AsEnumerable() 
                     .Join(dtCDGroup.AsEnumerable().DefaultIfEmpty(), 
                           fieldList => fieldList.Field<string>("CDGroupID"), 
                           cd => cd.Field<string>("CDGroupID"), 
                           (fieldList, cd) => new 
                           { 
                               FieldID = fieldList.Field<string>("FieldID"), 
                               CdGroup = cd.Field<string>("Name"), 
                               CDCaption = fieldList.Field<string>("CDCaption"), 
                               Priority = (cd.Field<string>("Priority") ?? "99"), 
                               fldIndex = fieldList.Field<string>("fldIndex").ToString() 
                           }) 
                     .OrderBy(result => result.Priority) 
                     .ThenBy(result => result.fldIndex);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM