积极答复者
一句SQL如何转换成LINQ语句?

问题
-
单价表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代码。
答案
-
这里需要另一个表,
假设有另一个销售人员表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:22
- 已标记为答案 冯瑞涛Moderator 2012年4月30日 3:12
全部回复
-
这里需要另一个表,
假设有另一个销售人员表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:22
- 已标记为答案 冯瑞涛Moderator 2012年4月30日 3:12