加入linq结果不显示我 [英] Join in linq result not show according me

查看:150
本文介绍了加入linq结果不显示我的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

亲爱的先生



我正在使用linq我的查询是

  var  query =( from  c  in  Categories 

join s in c.Id上的子类别等于s.Category_id

orderby c.Id

select new
{
cateid = c.Id,
catename = c.Name,
subcateid = s.Id,
subcatename = s。名称,

})。Distinct()。ToList();

query.Dump();



我的结果是

 cateid catename subcateid subatename 
1模块化办公家具40 45mm面板基座系统
1模块化办公家具41 60mm面板基座系统
1模块化办公家具42 75mm瓷砖底座系统



但我想要那个模块化办公家具和id 1不重复

 cateid catename subcateid subatename 
1模块化办公家具40 45mm面板基座系统
null 41 60mm面板基本系统
null 42 75mm平铺基础系统





添加代码块 - OriginalGriff [/ edit]

解决方案

您获得的结果是预期的结果。数据库引擎一直返回结果。你无法避免得到记录的重复部分。



你可以得到任何你想要的结果的唯一方法是你的查询返回每条记录或你不知道什么不想重复,然后有子记录的子集合。

 ....选择新的
{
categoryId = c。 Id,
categoryName = c.Name,
subcategories =(来自子类别中的s
其中s.Category_id = c.Id
选择新的
{
subCategoryId = s.Id,
subCategoryName = s.Name
})
})。ToList();



这将导致结果在每个类别记录的子类别集合中。


另一种方法是使用这样的查询:



  var  qry = 来自 c  类别 join  
s in 子类别。选择((a,x)= > new {cateid = a.cateid,index = x + 1,subcateid = a.subcateid,subcatename = a.subcatename})c.cateid上的
等于s.cateid
选择 new
{
cateid = s.index == 1 ? c.cateid.ToString(): string .Empty,
catename = s.index == 1 ? c.catename: string .Empty,
subcateid = s.subcateid,
subcatename = s.subcatename
};





结果:

  cateid catename subcateid subatename  
1模块化办公家具40 45mm面板基座系统
41 60mm面板基座系统
42 75mm面板基座系统





完整的 LinqPad 示例代码[ ^ ]:

  void  Main()
{

List< category>> Categories = new 列表< category>
{
new 类别( 1 模块化办公家具
};

List< subcategory>子类别= 列表<子类别>
{
new 子类别( 40 1 45mm面板基础系统),
new 子类别( 41 1 60mm Panel Base System),
new subcategory( 42 1 75mm面板基础系统
};

var qry = 来自 c in 类别 join
s 子类别。选择((a,x) = > new {cateid = a.cateid,index = x + 1,subcateid = a.subcateid ,subcatename = a.subcatename})c.cateid上的
等于s.cateid
选择 new
{
cateid = s.index == 1 ? c.cateid.ToString(): string .Empty,
catename = s.index == 1 ? c.catename: string .Empty,
subcateid = s.subcateid,
subcatename = s.subcatename
};

qry.Dump();

}

// 在此处定义其他方法和类
class category
{
private int cid = 0 ;
private string cn = string .Empty;

public 类别( int _cid, string _cn)
{
cid = _cid;
cn = _cn;
}

public int cateid
{
get { return cid;}
set {cid = value ;}
}

public string catename
{
get { return cn;}
set {cn = value ;}
}


}

class 子类别
{
private string scn = string .Empty;
private int scid = 0 ;
private int cid = 0 ;

public 子类别( int _scid, int _cid, string _scn)
{
scid = _scid;
cid = _cid;
scn = _scn;
}

public int cateid
{
get { return cid;}
set {cid = value ;}
}

public int subcateid
{
get { return scid;}
set {scid = value ;}
}

public string subatename
{
get { return scn;}
设置 {scn = 价值;}
}

}


Dear Sir

I m working on linq my query is

var query = (from c in Categories

             join s in Subcategories on c.Id equals s.Category_id

             orderby c.Id

             select new
             {
                 cateid= c.Id,
                 catename= c.Name,
                 subcateid= s.Id,
                 subcatename= s.Name,

             }).Distinct().ToList();

     query.Dump();


my result is

cateid  catename                    subcateid   subcatename
1	Modular Office Furniture	40	45mm Panel Base System
1	Modular Office Furniture	41	60mm Panel Base System
1	Modular Office Furniture	42	75mm Tile Base System


But i want that Modular Office Furniture and id 1 is not repeat

cateid  catename                    subcateid   subcatename
1	Modular Office Furniture	40	45mm Panel Base System
       null                            	41	60mm Panel Base System
       null                             42	75mm Tile Base System



[edit]Code block added - OriginalGriff[/edit]

解决方案

The result you're getting is what is expected. Database engines return results like that all the time. You cannot avoid getting the repeated parts of the records.

The only way you can get a result anything like you want is if your query returns each record or what you don't want repeated, and then there is a child collection of your sub records.

....select new 
    {
        categoryId = c.Id,
        categoryName = c.Name,
        subcategories = (from s in Subcategories
                         where s.Category_id = c.Id
                         select new
                         {
                             subCategoryId = s.Id,
                             subCategoryName = s.Name
                         })
    }).ToList();


This will result in a collection of subcategories in each category record.


Another way is to use query like this:

var qry = from c in Categories join
        s in Subcategories.Select((a,x) => new{cateid = a.cateid, index=x+1, subcateid = a.subcateid, subcatename = a.subcatename})
        on c.cateid equals s.cateid
        select new
        {
            cateid = s.index==1 ? c.cateid.ToString() : string.Empty,
            catename = s.index==1 ? c.catename : string.Empty,
            subcateid = s.subcateid,
            subcatename = s.subcatename
        };



Result:

cateid    catename                 subcateid    subcatename
1         Modular Office Furniture 40           45mm Panel Base System 
                                   41           60mm Panel Base System 
                                   42           75mm Panel Base System 



Complete sample code for LinqPad[^]:

void Main()
{

	List<category>> Categories = new List<category>
	{
		new category(1, "Modular Office Furniture")
	};
	
	List<subcategory> Subcategories = new List<subcategory>
	{
		new subcategory(40, 1, "45mm Panel Base System"),
		new subcategory(41, 1, "60mm Panel Base System"),
		new subcategory(42, 1, "75mm Panel Base System")
	};
	
	var qry = from c in Categories join
			s in Subcategories.Select((a,x) => new{cateid = a.cateid, index=x+1, subcateid = a.subcateid, subcatename = a.subcatename})
			on c.cateid equals s.cateid
			select new
			{
				cateid = s.index==1 ? c.cateid.ToString() : string.Empty, 
				catename = s.index==1 ? c.catename : string.Empty,
				subcateid = s.subcateid,
				subcatename = s.subcatename
			}; 
		
	qry.Dump();

}

// Define other methods and classes here
class category
{
	private int cid = 0;
	private string cn = string.Empty;

	public category(int _cid, string _cn)
	{
		cid = _cid;
		cn = _cn;
	}
	
	public int cateid
	{
		get{return cid;}
		set{cid = value;}
	}
	
	public string catename
	{
		get{return cn;}
		set{cn = value;}
	}
	

}

class subcategory
{
	private string scn = string.Empty;
	private int scid = 0;
	private int cid = 0;
	
	public subcategory(int _scid, int _cid, string _scn)
	{
		scid = _scid;
		cid = _cid;
		scn = _scn;
	}
	
	public int cateid
	{
		get{return cid;}
		set{cid = value;}
	}

	public int subcateid
	{
		get{return scid;}
		set{scid = value;}
	}
	
	public string subcatename
	{
		get{return scn;}
		set{scn = value;}
	}

}


这篇关于加入linq结果不显示我的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆