首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Linq 想实现Left Join 功能,老抛错误,各位大牛帮看看

2013-02-25 
Linq 想实现Left Join 功能,老抛异常,各位大牛帮看看static void Main(string[] args){DataTable dt1 ne

Linq 想实现Left Join 功能,老抛异常,各位大牛帮看看

static void Main(string[] args)
        {
            DataTable dt1 = new DataTable();
            dt1.Columns.Add("id", typeof(int));
            dt1.Columns.Add("name", typeof(string));
            DataTable dt2 = new DataTable();
            dt2.Columns.Add("id", typeof(int));
            dt2.Columns.Add("sex", typeof(string));
            for (int i = 0; i < 3; i++)
            {
                DataRow dr = dt1.NewRow();
                dr["id"] = i;
                dr["name"] = "table1 " + i;
                dt1.Rows.Add(dr);
            }
            for (int i = 1; i < 4; i++)
            {
                DataRow dr = dt2.NewRow();
                dr["id"] = i;
                dr["sex"] = "sex  " + i;
                dt2.Rows.Add(dr);
            }
            //var q = dt1.AsEnumerable().Join(dt2.AsEnumerable(), dt1key => dt1key.Field<int>("id"),
            //            dt2key => dt2key.Field<int>("id"), (dt1key, dt2key) => new
            //{
            //    id = dt1key.Field<int>("id"),
            //    name = dt1key.Field<string>("name"),
            //    sex = dt2key.Field<string>("sex") 
            //});
            var q = from member in dt1.AsEnumerable()
                    join club in dt2.AsEnumerable() on member.Field<int>("id") equals club.Field<int>("id")


                        into ret
                    from source in ret.DefaultIfEmpty()
                    select new
                    {
                        id = source.Field<int>("id"),
                        name = source.Field<string>("name"),
                        sex = (source==null?string.Empty: source.Field<string>("sex"))
                    };
            foreach (var obj in q)
            {
                Console.WriteLine(
                    "{0} - {1} - {2}",
                    obj.id,
                    obj.name,
                    obj.sex);
            }
        }


System.ArgumentNullException was unhandled
  HResult=-2147467261
  Message=值不能为 null。
参数名: row
  Source=System.Data.DataSetExtensions
  ParamName=row
  StackTrace:
       在 System.Data.DataRowExtensions.Field[T](DataRow row, String columnName)
       在 ConsoleApplication1.Program.<Main>b__6(<>f__AnonymousType0`2 <>h__TransparentIdentifier0, DataRow source) 位置 E:\WorkSpace\DotNet\Local\ConsoleApplication1\ConsoleApplication1\Program.cs:行号 44
       在 System.Linq.Enumerable.<SelectManyIterator>d__31`3.MoveNext()
       在 ConsoleApplication1.Program.Main(String[] args) 位置 E:\WorkSpace\DotNet\Local\ConsoleApplication1\ConsoleApplication1\Program.cs:行号 50
  InnerException: 
linq left?join
[解决办法]
ArgumentNullException,有控制,linq选出数据可能遇到无数据的情况,这个你要控制一下
[解决办法]
try

 var q = from member in dt1.AsEnumerable()
                    join club in dt2.AsEnumerable() on member.Field<int>("id") equals club.Field<int>("id")


                        into ret
                    from source in ret.DefaultIfEmpty()
                    select new
                    {
                        id = member.Field<int>("id"),
                        name =member .Field<string>("name"),
                        sex = (source == null ? string.Empty : source.Field<string>("sex"))
                    };

热点排行