当前位置: 代码迷 >> C# >> LINQ左外连接的有关问题
  详细解决方案

LINQ左外连接的有关问题

热度:80   发布时间:2016-05-05 04:27:14.0
LINQ左外连接的问题
  我用LINQ连接一个DataSet中的两个表,表结构如下:
左表:
右表:
这是我的代码:

                var productQuery = this.ds.Tables["product"].AsEnumerable();
                var shortQuery = this.ds.Tables["short"].AsEnumerable();
                var query =
                    from p in productQuery
                    join s in shortQuery
                    on p.Field<Int32>("shirt_item_id") equals s.Field<Int32>("shirt_item_id") into ps
                    from item in ps
                    select new
                    {
                        shirt = item.Field<Int32>("shirt_item_id"),
                        s_quantity = item.Field<Decimal>("s_quantity")
                    };

为什么这样是未产生任何枚举呢?应该是有6条记录的啊。我是哪里出错了?请大神解惑~
这是我参考的msdn:http://msdn.microsoft.com/zh-cn/library/bb399415%28v=vs.110%29.aspx
------解决思路----------------------
from p in productQuery
join s in shortQuery
on p.Field<Int32>("shirt_item_id") equals s.Field<Int32>("shirt_item_id") into ps
from item in ps.DefaultIfEmpty()
select new
{
   shirt = item.Field<Int32>("shirt_item_id"),
   s_quantity = item == null ? 0 : item.Field<Decimal>("s_quantity")
};
------解决思路----------------------
1楼已经告诉你方法了,你只需要将select new{}中的所有涉及到右表的取值都加个三元判断就可以了:

var productQuery = this.ds.Tables["product"].AsEnumerable();
                var shortQuery = this.ds.Tables["short"].AsEnumerable();
                var query =
                    from p in productQuery
                    join s in shortQuery
                    on p.Field<int>("shirt_item_id") equals s.Field<int>("shirt_item_id") into ps
                    from item in ps.DefaultIfEmpty()
                    select new
                    {
                        shirt = item==null?0: item.Field<Int32>("shirt_item_id"),
                        s_quantity = item==null?0:item.Field<Decimal>("s_quantity")
                    };
  相关解决方案