具有大于和小于日期条件的LINQ左外部联接
我已经为此挣扎了一段时间,但找不到具有基于日期的多个条件的LINQ外部联接的语法。我一直在研究GroupJoin语法,但这只让您比较一个字段值(通常是ID) 我想测试父表的日期(例如“UpdateDate”)是否在子表中定义的多个值(例如“StartDate”和“EndDate”)内。如果父日期符合条件,则从子表中提取一列或两列。否则,子表中的那些列应该为null(经典的左连接) 我认为查询语法不起作用,因为它只识别Equijoin具有大于和小于日期条件的LINQ左外部联接,linq,conditional,left-join,Linq,Conditional,Left Join,我已经为此挣扎了一段时间,但找不到具有基于日期的多个条件的LINQ外部联接的语法。我一直在研究GroupJoin语法,但这只让您比较一个字段值(通常是ID) 我想测试父表的日期(例如“UpdateDate”)是否在子表中定义的多个值(例如“StartDate”和“EndDate”)内。如果父日期符合条件,则从子表中提取一列或两列。否则,子表中的那些列应该为null(经典的左连接) 我认为查询语法不起作用,因为它只识别Equijoin 在LINQ中有没有使用Lambda语法的方法呢?我一直在尝试使
在LINQ中有没有使用Lambda语法的方法呢?我一直在尝试使用“SelectMany”和“DefaultIfEmpty”的组合,但在尝试定义联接时总是遇到困难。在LINQ中执行此操作的方法:
var q = from a in TableA
from b in TableB.where(x => a.Date > x.StartDate && a.Date < x.EndDate).DefaultIfEmpty()
select {...}
var q=来自表a中的a
从表b中的b开始,其中(x=>a.Date>x.StartDate&&a.Date
使用的参数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,
...
如果父日期符合条件,请从子表中提取一两列,否则子表中的这些列应为空
您是否可以添加一些示例数据(3-10个实体)以及哪些实体应该通过某些给定的约束来显示?关于示例数据,为简单起见,请想象一个具有ID、Desc和UpdateDate的父表,以及一个具有StartDate、EndDate和WEEKNAMER列的子表(可能更好的描述是“辅助”表)。两个表之间没有匹配的列。我希望这有帮助…不。请在您的问题中添加一些代码。写下一个简单的示例类(例如,
public class MyEntity{public int Id{get;set;}}
或multiple以显示关系)和一些代码,这些代码创建一个列表(或multiple以表示关系),其中包含一些实体。然后写下您希望在查询中设置哪些约束,以及上面的哪些实体应该出现。如果你给出这个,我可以很容易地复制这个代码并解决你的问题。Harold,这两个表之间没有匹配的主键/外键列。我没有设计数据库。。。。在这种情况下,您的解决方案仍然适用吗?GroupJoin是SQL左外部联接,后跟GroupBy。如果您的键选择器选择可用于进行连接的属性,那么我猜它会起作用。另一方面:你为什么不用List
和List
在一个虚拟项目中尝试呢?我一直在一个虚拟项目中尝试,但是没有成功,这就是我为什么在这里发布的原因。有趣。我尝试了两个列表,其中我加入了父母和姓氏上的孩子,以获得“父母和他们的孩子”。啊哈,是的,在这种情况下,转换成g
是没有用的,因为它不是一个组连接。更新答案。
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,
...
},
});