C# LINQ查询以显示两个表的结果
这是我的两张桌子 购买股票 SoldShare 我想从LINQ查询得到的结果表是 此结果表包含公司名称和总买卖股份 到目前为止,我的代码是:C# LINQ查询以显示两个表的结果,c#,.net,linq,linq-to-sql,linq-query-syntax,C#,.net,Linq,Linq To Sql,Linq Query Syntax,这是我的两张桌子 购买股票 SoldShare 我想从LINQ查询得到的结果表是 此结果表包含公司名称和总买卖股份 到目前为止,我的代码是: var userHistoryAll = from buy in db.share_bought_history join sold in db.share_sold_history on buy.regist_id equals sold.regist_id
var userHistoryAll = from buy in db.share_bought_history
join sold in db.share_sold_history
on buy.regist_id equals sold.regist_id
select new
{
buy,
sold
} into combine
group combine by combine.buy.comapnay_id
into final
select new
{
cName = final.FirstOrDefault().buy.company.company_name,
uBuy = final.Sum(x => x.buy.no_of_sahre),
uSold = final.Sum(x => x.sold.no_of_sahre)
};
但我无法得到想要的结果。请尝试以下操作:
var userHistoryAll = (from buy in db.share_bought_history
join sold in db.share_sold_history
on buy.comapnay_id equals sold.comapnay_id
select new { buy = buy, sold = sold})
.GroupBy(x => x.buy.comapnay_id)
.Select(x => new {
cName=x.Key,
uBuy = x.Select(y => y.buy.no_of_sahre).Sum(),
uSold = final.Select(y => y.sold.no_of_sahre).Sum()
}).ToList();
请尝试以下操作:
var userHistoryAll = (from buy in db.share_bought_history
join sold in db.share_sold_history
on buy.comapnay_id equals sold.comapnay_id
select new { buy = buy, sold = sold})
.GroupBy(x => x.buy.comapnay_id)
.Select(x => new {
cName=x.Key,
uBuy = x.Select(y => y.buy.no_of_sahre).Sum(),
uSold = final.Select(y => y.sold.no_of_sahre).Sum()
}).ToList();
问题是,您的数据没有唯一的键可以加入(至少我是这样认为的) 因此,首先在连接之前进行连接 我个人预先提供lambda语法,但您可以对其进行转换
var buyGroub = BuyShare.GroubBy(x=>x.Id)
.Select(x=> new
{
name = x.Name,
buy = x.Sum(s => s.Share)
}
var soldGroub = SoldShare.GroubBy(x=>x.Id)
.Select(x=> new
{
name = x.Name,
sold = x.Sum(s => s.Share)
}
现在你可以随心所欲地展示
var result = buyGroub.Join(soldGroub,
a=>a.name,
b=>b.name,
(a,b)=>new {a.Name , a.buy , b.sold});
编辑
要获取列表1中的记录而不是列表2中的记录,以及其他方法,您需要执行一个名为..的操作。。检查已接受的答案它有两个数组,相当于您的两个列表。问题是您的数据没有唯一的键可以连接(至少我是这么认为的) 因此,首先在连接之前进行连接 我个人预先提供lambda语法,但您可以对其进行转换
var buyGroub = BuyShare.GroubBy(x=>x.Id)
.Select(x=> new
{
name = x.Name,
buy = x.Sum(s => s.Share)
}
var soldGroub = SoldShare.GroubBy(x=>x.Id)
.Select(x=> new
{
name = x.Name,
sold = x.Sum(s => s.Share)
}
现在你可以随心所欲地展示
var result = buyGroub.Join(soldGroub,
a=>a.name,
b=>b.name,
(a,b)=>new {a.Name , a.buy , b.sold});
编辑
要获取列表1中的记录而不是列表2中的记录,以及其他方法,您需要执行一个名为..的操作。。检查接受的答案它有两个数组,相当于你的两个列表你不必做
x.Select(y=>y.buy.no\u of_sahre.Sum(),x.Sum(y=>y.buy.no\u of_sahre)
你的意思是uSold=x.Select(…
你不必做x.Select(y=>y.buy.no_of_sahre).Sum()
,你可以通过这个uSold=final.Select(…
你的意思是uSold=x.Select吗(…
?@Vikhram我搜索了一点,但没有结果可以在非唯一上加入?现在唯一的问题是它没有显示buy表中的所有条目。场景是buy表包含4家公司的股票,但用户只出售了3家公司的股票。这意味着第4家公司不在Seld表中。现在,此查询的结果仅显示3 c公司,我希望第四家公司的销售额为0的所有4家公司。一个更简单的解决方案是,在执行联接代码之前..循环第一个列表并检查第二个列表中是否有相应的记录,如果没有,则添加一个具有相同id和数量0的记录..另一种方法是循环..谢谢,但我尝试了这个方法,它可以工作。var result=从buyGroub中的a将a.name=b.name上的soldGroub中的b连接到temp.DefaultIfEmpty()中的c中的temp,选择new{cName=a.name,uBuy=a.buy,uSold=c!=null?c.sell:0}
很高兴提供帮助,如果此答案解决了您的问题,请单击答案旁边的复选标记将其标记为已接受。这是为了节省其他用户试图解决您的问题的时间,请参见:@Vikhram我搜索了一点,但没有结果是否可以加入非唯一?现在唯一的问题是它没有显示m buy table。该场景是buy table包含4家公司的股份,但用户只出售了3家公司的股份。这意味着第4家公司不在Seld table中。现在查询结果显示只有3家公司,我希望第4家公司的Seld值为0的所有4家公司。一个更简单的解决方案是,在执行联接代码之前..循环第一个列表,然后c检查第二个是否有对应的记录,如果没有,则添加一个id和数量相同的记录。另一个方法是在周围添加一个记录…谢谢,但我尝试了这个方法,它可以工作。var result=from a in buyGroub join b in soldGroub on a.name=b.name in temp.DefaultIfEmpty()中的c in temp选择new{cName=a.name,uBuy=a.buy,uSold=c!=null?c.sell:0};
很乐意帮助,如果此答案解决了您的问题,请单击答案旁边的复选标记将其标记为已接受。这是为了节省其他用户尝试解决您的问题的时间,请参阅: