none
一句SQL如何转换成LINQ语句? RRS feed

  • 问题

  • 单价表P_price
    name price
    电脑-3000
    冰箱-1000
    手机-2000

    详细表P_detalis
    id userid name count
    1---1-----电脑---10
    2---1-----手机---2
    3---2-----手机---3

    要想显示的结果是:(条件是userid为1的用户的销售情况)
    userid name count
    1----电脑------10
    1----冰箱------0
    1----手机------2

    解决此问题的SQL代码---------------------
    select 
      pp.name,
      isnull(pd.[count],0) [count]
    from
      #P_price pp left join #P_detalis pd on pp.name=pd.name
    and userid=1  
    ----------------------------------------

    请问高手如果解决该问题?怎么转换成linq代码。
    2010年4月29日 2:18

答案

  • 首先声明:我不是什么高手,面对这个问题,我是通过查书后,自己琢磨的,没有经过测试以及高手的认定。也就是说,正确与否我不保证,仅提供一个参考。

     

     

    from p in dc.pp

        join d in dc.pd on p.name equals d.name

        where p.userid=1

        select p

     

     

     

     


    坚持,只有这一条通向成功的路了。
    2010年8月19日 7:56
  • 这里需要另一个表,
    假设有另一个销售人员表P_sales
    id name
    1--张三
    2--李四

    又假设你已经从数据库抓出了实体列表IEnumerable<Sale>类型的数据lstSales,
    实体列表IEnumerable<Detail>类型的数据lstDetails,实体列表IEnumerable<Price>类型的数据lstPrice.

    需要的Linq请看如下代码:
    虽然看似复杂,但Linq的Left Join还真得这么写,查询结果也是你所要的

    class Program
    {
    	static void Main(string[] args)
    	{
    		var lstPrice = new List<Price>
    		{
    			new Price(){name="电脑",price=3000},
    			new Price(){name="冰箱",price=1000},
    			new Price(){name="手机",price=2000},
    		};
    
    		var lstSales = new List<Sale>
    		{
    			new Sale(){id=1,name="张三"},
    			new Sale(){id=2,name="李四"}
    		};
    
    		var lstDetails = new List<Detail>
    		{
    			new Detail(){id=1,userid=1,name="电脑",count=10},
    			new Detail(){id=2,userid=1,name="手机",count=2},
    			new Detail(){id=3,userid=2,name="手机",count=3}
    		};
    
    		//以上假设为数据从各个表拉出来的三个变量
    
    		var result = from s in lstSales
    				join p in lstPrice on 1 equals 1
    				join d in lstDetails on 
    					new { userid = s.id, pname = p.name } //多条件判断
    					equals 
    					new { userid = d.userid, pname = d.name } 
    						into nGroup
    				from item in nGroup.DefaultIfEmpty	(
    					new Detail { count = 0 } //左连默认值
    								)
    				where s.id == 1
    				select new { 
    						userid = s.id, 
    						proname = p.name, 
    						count = item.count 
    					};
    
    		var arr = result.ToArray(); //结果
    
    	}
    }
    
    public class Price
    {
    	public string name { get; set; }
    	public int price { get; set; }
    }
    
    public class Sale
    {
    	public int id { get; set; }
    	public string name { get; set; }
    }
    public class Detail
    {
    	public int id { get; set; }
    	public int userid { get; set; }
    	public string name { get; set; }
    	public int count { get; set; }
    }
    
    2010年8月19日 9:18

全部回复

  • 首先声明:我不是什么高手,面对这个问题,我是通过查书后,自己琢磨的,没有经过测试以及高手的认定。也就是说,正确与否我不保证,仅提供一个参考。

     

     

    from p in dc.pp

        join d in dc.pd on p.name equals d.name

        where p.userid=1

        select p

     

     

     

     


    坚持,只有这一条通向成功的路了。
    2010年8月19日 7:56
  • 这里需要另一个表,
    假设有另一个销售人员表P_sales
    id name
    1--张三
    2--李四

    又假设你已经从数据库抓出了实体列表IEnumerable<Sale>类型的数据lstSales,
    实体列表IEnumerable<Detail>类型的数据lstDetails,实体列表IEnumerable<Price>类型的数据lstPrice.

    需要的Linq请看如下代码:
    虽然看似复杂,但Linq的Left Join还真得这么写,查询结果也是你所要的

    class Program
    {
    	static void Main(string[] args)
    	{
    		var lstPrice = new List<Price>
    		{
    			new Price(){name="电脑",price=3000},
    			new Price(){name="冰箱",price=1000},
    			new Price(){name="手机",price=2000},
    		};
    
    		var lstSales = new List<Sale>
    		{
    			new Sale(){id=1,name="张三"},
    			new Sale(){id=2,name="李四"}
    		};
    
    		var lstDetails = new List<Detail>
    		{
    			new Detail(){id=1,userid=1,name="电脑",count=10},
    			new Detail(){id=2,userid=1,name="手机",count=2},
    			new Detail(){id=3,userid=2,name="手机",count=3}
    		};
    
    		//以上假设为数据从各个表拉出来的三个变量
    
    		var result = from s in lstSales
    				join p in lstPrice on 1 equals 1
    				join d in lstDetails on 
    					new { userid = s.id, pname = p.name } //多条件判断
    					equals 
    					new { userid = d.userid, pname = d.name } 
    						into nGroup
    				from item in nGroup.DefaultIfEmpty	(
    					new Detail { count = 0 } //左连默认值
    								)
    				where s.id == 1
    				select new { 
    						userid = s.id, 
    						proname = p.name, 
    						count = item.count 
    					};
    
    		var arr = result.ToArray(); //结果
    
    	}
    }
    
    public class Price
    {
    	public string name { get; set; }
    	public int price { get; set; }
    }
    
    public class Sale
    {
    	public int id { get; set; }
    	public string name { get; set; }
    }
    public class Detail
    {
    	public int id { get; set; }
    	public int userid { get; set; }
    	public string name { get; set; }
    	public int count { get; set; }
    }
    
    2010年8月19日 9:18