[英]linq to sql select inside an inner join
I am a beginner in linq to sql, I am wondering what is the syntax in for a select inside a inner join : 我是linq to sql的初学者,我想知道内部连接内的select的语法是什么:
inner join ( select CCL_TMA_ID as SecurityIdMax ,
max(CCL_DATE) as DateMax
from dbo.usrCOURSCLOTURE
where CCL_DONNEE is not null
and CCL_DATE <= @d
group by CCL_TMA_ID
)
complete query : 完整查询:
declare @d datetime
select @d = getdate()
select t0.CCL_TMA_ID as SecurityId ,
t0.CCL_DATE as Date ,
t0.CCL_DONNEE as Price ,
t1.CCL_DONNEE as CurrencyPrice
from dbo.usrCOURSCLOTURE as t0
inner join dbo.usrCOURSCLOTURE as t1 on t0.CCL_DEV_DONNEE = t1.CCL_TMA_ID
and t0.CCL_DATE = t1.CCL_DATE
and t1.CCL_DONNEE is not null
inner join ( select CCL_TMA_ID as SecurityIdMax ,
max(CCL_DATE) as DateMax
from dbo.usrCOURSCLOTURE
where CCL_DONNEE is not null
and CCL_DATE <= @d
group by CCL_TMA_ID
) cMax on t0.CCL_TMA_ID = SecurityIdMax
and t0.CCL_DATE <= DateMax
and t0.CCL_DATE >= DateMax-10
where t0.CCL_DATE > dateadd(year,-1,@d)
I've done a query for you below with a few comments explaining some of the features. 我在下面为您查询了一些注释,解释了一些功能。 Note that you can't do a multiple condition join based on <= such as
请注意,您不能基于<=进行多条件联接,例如
on t0.CCL_TMA_ID = SecurityIdMax
and t0.CCL_DATE <= DateMax
and t0.CCL_DATE >= DateMax-10
you'd have to join on the first condition and then filter them out with a where afterwards 您必须先加入第一个条件,然后再用where过滤掉它们
eg 例如
Datetime d = Datetime.Now;
Datetime lastYear = d.AddYears(-1);
var q = from t0 in db.usrCOURSCLOTURE
join t1 in db.usrCOURSCLOTURE.where(z => z.CCL_DONNEE.HasValue)
on new {a = t0.CCL_DEV_DONNEE, b = t0.CCL_DATE} equals new {a = t1.CCL_TMA_ID, b = t1.CCL_DATE}
// the above is how to do a join on multiple conditions
join t2 in (
from x0 in db.usrCOURSCLOTURE.where(z => z.CCL_DONNEE.HasValue && z.CCL_DATE < d)
.GroupBy(z => z.CCL_TMA_ID)
select new {SecurityIdMax = x0.Key, DateMax = x0.Max(z => z.CCL_DATE)}
//this is how you get your groupby subquery
)
on t0.CCL_TMA_ID equals t2.SecurityIdMax
where
t0.CCL_DATE > lastYear
&& t0.CCL_DATE <= t2.DateMax
&& t0.CCL_DATE >= SqlFunctions.DateAdd("DAY", -10, t2.DateMax) //nb not sure on the interval - correct this!
select new {SecurityId = t0.CCL_TMA_ID,
Date = t0.CCL_DATE,
Price = t0.CCL_DONNEE,
CurrencyPrice = t1.CCL_DONNEE};
Also note that the "SqlFunctions" class is in the namespace System.Data.Objects.SqlClient in the System.Data.Entity assembly. 另请注意,“ SqlFunctions”类位于System.Data.Entity程序集中的命名空间System.Data.Objects.SqlClient中。
By enclosing statement into brackets you create a subset of data which in your case will be selection from dbo.usrCOURSCLOTURE
grouped by CCL_TMA_ID
column. 通过将语句括在方括号中,您可以创建一个数据子集,在这种情况下,将从
dbo.usrCOURSCLOTURE
选择(按CCL_TMA_ID
列分组)。
To make it clearer lets put it in different way: 为了更清楚,让我们用不同的方式来表示:
@subsetOfData = select CCL_TMA_ID as SecurityIdMax, max(CCL_DATE) as DateMax
from dbo.usrCOURSCLOTURE
where CCL_DONNEE is not null and CCL_DATE <= @d
group by CCL_TMA_ID
and then 接着
select t0.CCL_TMA_ID as SecurityId ,
t0.CCL_DATE as Date ,
t0.CCL_DONNEE as Price ,
t1.CCL_DONNEE as CurrencyPrice
from dbo.usrCOURSCLOTURE as t0
inner join dbo.usrCOURSCLOTURE as t1 on t0.CCL_DEV_DONNEE = t1.CCL_TMA_ID
and t0.CCL_DATE = t1.CCL_DATE
and t1.CCL_DONNEE is not null
inner join @subsetOfData as cMax on t0.CCL_TMA_ID = SecurityIdMax
and t0.CCL_DATE <= DateMax
and t0.CCL_DATE >= DateMax-10
where t0.CCL_DATE > dateadd(year,-1,@d)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.