如何解决如何使用linq lamba表达式与内部联接分组
我正在尝试将sql存储的proc转换为linq。我在groupby和内部联接方面遇到问题。
这是我尝试过的:
var r = _context.Table1
.GroupBy(x => new { x.OptionId,x.Years,x.Strike })
.Join(_context.Table2,oc => oc.OptionId,o => o.OptionId,(oc,o) => new
{
OptionsCosts = oc,Options = o
}).Where(x => x.Options.OptionType == 1
&& x.Options.QualifierId != null
&& x.Options.CreditingMethod != "xxx")
.Select(y => new DataModel.Table1()
{
Years = y.Select(a => a.OptionsCosts.Years).FirstOrDefault(),Strike = y.Select(a => a.OptionsCosts.Strike).FirstOrDefault(),Value = y.Select(a => a.OptionsCosts.Value).FirstOrDefault(),ChangeUser = y.Select(a => a.OptionsCosts.ChangeUser).FirstOrDefault(),ChangeDate = DateTime.Now,OptionId = y.Select(a => a.OptionsCosts.OptionId).FirstOrDefault()
});
这是我要转换的SQL:
SELECT o2.OptionId,o2.Years,o2.Strike,SUM(d2.Weights) as 'TotalWeight',COUNT(*) as 'Counts'
FROM Table1 o2
INNER JOIN @Dates d2 --this is a temp table that just holds dates. I was thinking just a where statement could do it???
ON d2.EffectiveDate = o2.EffectiveDate
INNER JOIN Table2 od2
ON od2.OptionId = o2.OptionId
AND od2.OptionType = 1
AND od2.qualifierid is null
AND od2.CreditingMethod <> 'xxx' --28095
GROUP BY o2.OptionId,o2.Strike
我的数据差强人意,所以我确定自己做错了事。
解决方法
var table1=_context.Table1
.groupBy(o2=> new{
o2.OptionId,o2.Years,o2.Strike
})
.select(s=> new{
s.key.OptionId,s.key.Years,s.key.Strike,TotalWeight=s.sum(x=>x.Weights),Counts=o2.count(c=>c.OptionId)
}).tolist();
var result=table1
.Join(_context.Table2,oc => oc.OptionId,o => o.OptionId,(oc,o) => new{ OptionsCosts = oc,Options = o })
.Where(x => x.Options.OptionType == 1
&& x.Options.QualifierId != null
&& x.Options.CreditingMethod != "xxx")
.select(x=> new {
x.oc.OptionId,x.oc.Years,x.oc.Strike,x.oc.TotalWeight,x.oc.Counts
}).tolist();
,
小建议,当您重写SQL查询时,请使用LINQ Query语法,该语法与SQL较为接近,可以更有效地避免错误。
var dates = new List<DateTime>() { DateTime.Now }; // fill list
var query =
from o2 in _context.Table1
where dates.Contains(o2.EffectiveDate)
from od2 in _context.Table1.Where(od2 => // another way to join
od2.OptionId == o2.OptionId
&& od2.OptionType == 1
&& od2.qualifierid == null
&& od2.CreditingMethod != "xxx")
group o2 by new { o2.OptionId,o2.Strike } into g
select new
{
g.Key.OptionId,g.Key.Years,g.Key.Strike,Counts = g.Count()
// SUM(d2.Weights) as 'TotalWeight',-this one is not available because dates in memory
};
如果您刚开始并尝试在LINQ上重写过程-EF Core是个坏主意。 IQueryable支持太有限,通常您会为每个复杂的LINQ查询而战。 尝试使用linq2db,它支持临时表,并且您存储的proc可以重写为相同的LINQ查询。或者,您可以使用linq2db.EntityFrameworkCore扩展EF Core功能。
免责声明。我是此扩展程序的创建者,也是linq2db创建者之一。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。