Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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_Grouping_Nullreferenceexception_Anonymous Class - Fatal编程技术网

C# LINQ左连接+;如果为空,则为默认值+;匿名类型+;分组

C# LINQ左连接+;如果为空,则为默认值+;匿名类型+;分组,c#,linq,grouping,nullreferenceexception,anonymous-class,C#,Linq,Grouping,Nullreferenceexception,Anonymous Class,我想知道针对给定问题的最佳解决方案是什么,简化如下: 我有两个本地存储的sql表,我想用默认的If-Empty属性连接它们(左连接),然后我需要对这些数据进行分组 我不想在访问obj.column之前检查(obj==null),如果给定行的连接没有成功,这将抛出一个错误 资料 代码 但我不想这样做,因为我必须处理现实生活场景中的20、30多个专栏 public class Helper { public string A, public string B, public

我想知道针对给定问题的最佳解决方案是什么,简化如下:

  • 我有两个本地存储的sql表,我想用默认的If-Empty属性连接它们(左连接),然后我需要对这些数据进行分组

  • 我不想在访问obj.column之前检查(obj==null),如果给定行的连接没有成功,这将抛出一个错误

  • 资料

    代码

    但我不想这样做,因为我必须处理现实生活场景中的20、30多个专栏

    public class Helper {
        public string A,
        public string B,
        public string C
    }
    
    如果你一直读到这里,非常感谢你抽出时间。希望在这里得到一些解决方案。
    谢谢。

    我认为
    代码说明了一切:

    var LeftTable = new[]
            {
                new { A = 1, B=1, C=1 },
                new { A = 1, B=2, C=2 },
                new { A = 5, B=6, C=7 }
            }
            .ToList();
    
    
            var RightTable = new[]
            {
                new { A = 1, B=1, Z=5 },
                new { A = 1, B=2, Z=6 }
            }
            .ToList();
    
    
            var query = (from left in LeftTable
                         join right in RightTable
                            on new { left.A, left.B } equals new { right.A, right.B }
                            into JoinedList
                         from right in JoinedList.DefaultIfEmpty(new { A = 0, B = 0, Z = 0 })
                         group left by new
                         {
                             left.A,
                             left.B,
                             left.C,
                             right.Z
                         } into g
                         select g)
                        .ToList();
    

    我和你有同样的问题,我必须找到一个方法,得出这样的结论(非常简单的例子):


    嗨,阿米尔,谢谢你的回复,这会有用的。。。然而。。我的大查询使用左连接连接大约10个表,每个表最多有30列,在使用它们之前,我还使用SQL to LINQ获取源代码,因此理想情况下我不会在连接中重新定义源代码结构。好的,没有任何问题,您可以使用
    .DefaultIfEmpty(新的{A=0,B=0,Z=0})
    ,当然,你需要传递一些匿名的东西,比如你的结构是
    。DefaultIfEmpty()
    我最终定义了左连接的结构(右表),然后可以在内部重用它。DefaultIfEmpyI也尝试了Activator.CreateInstance,但匿名类型没有成功。
    DefaultIfEmpty(new Helper())
    
    public class Helper {
        public string A,
        public string B,
        public string C
    }
    
    var LeftTable = new[]
            {
                new { A = 1, B=1, C=1 },
                new { A = 1, B=2, C=2 },
                new { A = 5, B=6, C=7 }
            }
            .ToList();
    
    
            var RightTable = new[]
            {
                new { A = 1, B=1, Z=5 },
                new { A = 1, B=2, Z=6 }
            }
            .ToList();
    
    
            var query = (from left in LeftTable
                         join right in RightTable
                            on new { left.A, left.B } equals new { right.A, right.B }
                            into JoinedList
                         from right in JoinedList.DefaultIfEmpty(new { A = 0, B = 0, Z = 0 })
                         group left by new
                         {
                             left.A,
                             left.B,
                             left.C,
                             right.Z
                         } into g
                         select g)
                        .ToList();
    
    var toReturn = from left in bd.leftys
                   join rights in myAnonimousGroupedList on left.Id equals rights.leftId into joinings
                   from right in joinings.DefaultIfEmpty()
                   select new {
                       left.A
                       left.B
                       left.C
                       // Z = right != null ? right.Z : 0
                       Z = joinings.Any() ? right.Z : 0 // see what i did here?
                   };