读书人

Linq 想实现Left Join 功能老抛错误

发布时间: 2013-02-25 10:23:36 作者: rapoo

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"))
};

读书人网 >.NET

热点推荐