Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有大于和小于日期条件的LINQ左外部联接_Linq_Conditional_Left Join - Fatal编程技术网

具有大于和小于日期条件的LINQ左外部联接

具有大于和小于日期条件的LINQ左外部联接,linq,conditional,left-join,Linq,Conditional,Left Join,我已经为此挣扎了一段时间,但找不到具有基于日期的多个条件的LINQ外部联接的语法。我一直在研究GroupJoin语法,但这只让您比较一个字段值(通常是ID) 我想测试父表的日期(例如“UpdateDate”)是否在子表中定义的多个值(例如“StartDate”和“EndDate”)内。如果父日期符合条件,则从子表中提取一列或两列。否则,子表中的那些列应该为null(经典的左连接) 我认为查询语法不起作用,因为它只识别Equijoin 在LINQ中有没有使用Lambda语法的方法呢?我一直在尝试使

我已经为此挣扎了一段时间,但找不到具有基于日期的多个条件的LINQ外部联接的语法。我一直在研究GroupJoin语法,但这只让您比较一个字段值(通常是ID)

我想测试父表的日期(例如“UpdateDate”)是否在子表中定义的多个值(例如“StartDate”和“EndDate”)内。如果父日期符合条件,则从子表中提取一列或两列。否则,子表中的那些列应该为null(经典的左连接)

我认为查询语法不起作用,因为它只识别Equijoin


在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,
                ...
            },
    });