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
C# 可空字段上的Linq左连接_C#_Linq - Fatal编程技术网

C# 可空字段上的Linq左连接

C# 可空字段上的Linq左连接,c#,linq,C#,Linq,在下面的示例中,我使用了entity1,其中user_id是一个可为null的int,有时它确实为null。Entity2类似于一座桥梁,通过用户id将entity1连接到entity3,以获得个人id,并最终获得相应的全名 我的目标是编写一个linq查询,在该查询中,如果entity1的user_id为null,则不抛出NullReferenceException,而是为fullname属性获取null 鉴于以下实体,我希望我的查询会返回以下内容: codeOfEntity=“21006.0

在下面的示例中,我使用了entity1,其中user_id是一个可为null的int,有时它确实为null。Entity2类似于一座桥梁,通过用户id将entity1连接到entity3,以获得个人id,并最终获得相应的全名

我的目标是编写一个linq查询,在该查询中,如果entity1的user_id为null,则不抛出NullReferenceException,而是为fullname属性获取null

鉴于以下实体,我希望我的查询会返回以下内容:

  • codeOfEntity=“21006.040”,全名=null
  • 实体代码=“14006.010”,全名=“约翰·史密斯”
  • codeOfEntity=“21006.020”,全名=null
  • codeOfEntity=“35716.001”,fullname=“Dave Doe”
  • codeOfEntity=“11153.013”,fullname=“扎克·怀特”
实体:

class entity1
{
    public int? user_id { get; set; }
    public string codeOfEntity { get; set; }
}

class entity2
{
    public int user_id { get; set; }
    public int person_id { get; set; }
}

class entity3
{
    public int person_id { get; set; }
    public string fullname { get; set; }
}
var listOfEntity1 = new List<entity1>()
{
    new entity1() { user_id = null, codeOfEntity = "21006.040" },
    new entity1() { user_id = 10, codeOfEntity = "14006.010" },
    new entity1() { user_id = null, codeOfEntity = "21006.020" },
    new entity1() { user_id = 1, codeOfEntity = "35716.001"},
    new entity1() { user_id = 4, codeOfEntity = "11153.013" }
};

var listOfEntity2 = new List<entity2>()
{
    new entity2() { user_id = 1, person_id = 100 },
    new entity2() { user_id = 4, person_id = 400 },
    new entity2() { user_id = 10, person_id = 1000 }
};

var listOfEntity3 = new List<entity3>()
{
    new entity3() { person_id = 100, fullname = "John Smith" },
    new entity3() { person_id = 400, fullname = "Dave Doe" },
    new entity3() { person_id = 1000, fullname = "Zach White" }
};
var result = (from e1 in listOfEntity1
              join e2 in listOfEntity2 on e1.user_id equals e2.user_id into e2Group
              from e2 in e2Group.DefaultIfEmpty()
              join e3 in listOfEntity3 on e2.person_id equals e3.person_id into e3Group
              from e3 in e3Group.DefaultIfEmpty()
              select new { e1.codeOfEntity, e3.fullname }).ToList();
并像这样填充:

class entity1
{
    public int? user_id { get; set; }
    public string codeOfEntity { get; set; }
}

class entity2
{
    public int user_id { get; set; }
    public int person_id { get; set; }
}

class entity3
{
    public int person_id { get; set; }
    public string fullname { get; set; }
}
var listOfEntity1 = new List<entity1>()
{
    new entity1() { user_id = null, codeOfEntity = "21006.040" },
    new entity1() { user_id = 10, codeOfEntity = "14006.010" },
    new entity1() { user_id = null, codeOfEntity = "21006.020" },
    new entity1() { user_id = 1, codeOfEntity = "35716.001"},
    new entity1() { user_id = 4, codeOfEntity = "11153.013" }
};

var listOfEntity2 = new List<entity2>()
{
    new entity2() { user_id = 1, person_id = 100 },
    new entity2() { user_id = 4, person_id = 400 },
    new entity2() { user_id = 10, person_id = 1000 }
};

var listOfEntity3 = new List<entity3>()
{
    new entity3() { person_id = 100, fullname = "John Smith" },
    new entity3() { person_id = 400, fullname = "Dave Doe" },
    new entity3() { person_id = 1000, fullname = "Zach White" }
};
var result = (from e1 in listOfEntity1
              join e2 in listOfEntity2 on e1.user_id equals e2.user_id into e2Group
              from e2 in e2Group.DefaultIfEmpty()
              join e3 in listOfEntity3 on e2.person_id equals e3.person_id into e3Group
              from e3 in e3Group.DefaultIfEmpty()
              select new { e1.codeOfEntity, e3.fullname }).ToList();
谢谢。

使用c#6.0的空传播

var result = (from e1 in listOfEntity1
              join e2 in listOfEntity2 on e1.user_id equals e2.user_id into e2Group
              from e2 in e2Group.DefaultIfEmpty()
              join e3 in listOfEntity3 on e2?.person_id equals e3.person_id into e3Group
              from e3 in e3Group.DefaultIfEmpty()
              select new { e1.codeOfEntity, e3?.fullname }).ToList();
注意连接条件中的简单更改,然后选择
。将
e2.person\u id
更改为
e2?.person\u id
join
e3.fullname
更改为
e3?.fullname
选择中

但是,如果您不能使用c#6.0,这里有一个替代方案

var result = (from e1 in listOfEntity1
              join e2 in listOfEntity2 on e1.user_id equals e2.user_id into e2Group
              from e2 in e2Group.DefaultIfEmpty()
              join e3 in listOfEntity3 on (e2==null?-1:e2.person_id) equals e3.person_id into e3Group
              from e3 in e3Group.DefaultIfEmpty()
              select new { e1.codeOfEntity, fullname=(e3==null?null:e3.fullname) }).ToList();

只需注意,由于这是一个Linq到对象的查询,所以它可以工作。但是如果处理可查询文件,第一个根本不起作用(因为表达式中不支持null传播运算符),第二个可能对所有查询提供程序都起作用,也可能不起作用。在C#6之前,首选的解决方案是将默认实例作为参数提供给
DefaultIfEmpty()