我已经为此苦苦挣扎了一段时间,找不到基于日期具有多个条件的LINQ外连接的语法。我一直在研究GroupJoin语法,但这只是让您比较一个字段值(通常是ID)。
我想测试父表的日期(例如“ UpdateDate”)是否落在子表中定义的多个值(例如“ StartDate”和“ EndDate”)之内。如果父日期符合条件,请从子表中拉一两列。如果不是,则子表中的这些列应为null(经典的左连接内容)。
我认为查询语法不会起作用,因为它只能识别等值连接。
在LINQ中有没有使用Lambda语法做到这一点的方法?我一直在尝试使用“ SelectMany”和“ DefaultIfEmpty”的某种组合,但在尝试定义联接时一直遇到困难。
答案 0 :(得分:0)
在linq中执行此操作的方法:
var q = from a in TableA
from b in TableB.where(x => a.Date > x.StartDate && a.Date < x.EndDate).DefaultIfEmpty()
select {...}
答案 1 :(得分:0)
使用Queryable.GroupJoin中的参数ResultSelector
选择所需内容:
var result = dbContext.Parents.GroupJoin(dbContext.Children,
// outer and inner key Selectors:
parent => parent.Id, // from every parent take the primary key
child => child.ParentId, // from every child take the foreign key to parent
// ResultSelector: take the parent and all his children to make one new object
(parent, children) => new
{
// Select only the Parent properties you actually plan to use:
Id = parent.Id,
Name = parent.Name,
...
Children = children.Select(child => new
{
// select only Child properties you plan to use:
Id = child.Id,
// No need: you know the value: ParentId = child.ParentId,
...
“如果父日期符合条件,请从子表中拉一两列,否则子表中的那些列应为空”
SpecialColumnA = (parent.BirthDay.Year < 2000) ?? child.BirthDay : null,
SpecialColumnB = (parent.Name == "Kennedy" ?? child.Name : null,
});
如果许多列的条件相同,请考虑只检查一次:
SpecialColumns = (parent.Birthday.Year >= 2000) ? null :
// else fill the special columns:
new
{
Name = child.Name,
SomeWeirdProperty = parent.Id + child.Id,
...
},
});