C# 如何加入实体dotnetcore/linq?
我有以下疑问C# 如何加入实体dotnetcore/linq?,c#,sql,entity-framework,linq,join,C#,Sql,Entity Framework,Linq,Join,我有以下疑问 SELECT * FROM Movie m INNER JOIN ( SELECT movie_id, COUNT(movie_id) as amount FROM Watchhistory WHERE watch_date >= DATEADD(day,-3000, GETDATE()) GROUP BY movie_id ) as a on m.movie_id = a.movie_id ORDER BY a.amount DESC 以
SELECT *
FROM Movie m INNER JOIN
(
SELECT movie_id, COUNT(movie_id) as amount
FROM Watchhistory
WHERE watch_date >= DATEADD(day,-3000, GETDATE())
GROUP BY movie_id
) as a on m.movie_id = a.movie_id
ORDER BY a.amount DESC
以及下表:
我现在的尝试是:
var movies=\u context.Movie
.AsNoTracking()
.加入(
_context.Watchhistory.Where(
w=>w.WatchDate>=Convert.ToDateTime(DateTime.Now).AddDays(-14))
.GroupBy(w=>w.MovieId)
.Select(m=>new{amount=m.Count(),mID=m.Key})
.OrderByDescending(a=>a.amount)
.Select(a=>new{movieid=a.mID}),
m=>m.MovieId,w=>w.MovieId,(m,w=>m);
我似乎无法让它在c#dotnet实体中工作。如何在linq中使用右外部联接?在linq中很少使用联接。相反,只需编写查询来导航模型 所以 变得像:
var q = from m in db.Movies
select new {m.MovieID,m.Name, amount = m.WatchHistory.Where( w => w.WatchDate >= ...).Count() };
var results = q.Where( m => m.amount > 0).OrderByDesc( m => m.amount).ToList();
David让我们看看你都做了些什么,为什么你甚至需要一个正确的外部连接?假设外键设置正确,则
movie
表中不存在movie
表中的movie\u id
。一个内部连接就足够了。不要再考虑sql了,想想linq吧“右外部联接”是一个sql概念@GarethD是对的,谢谢你!哇,真糟糕。内部连接确实更好(我怎么会这么愚蠢)<代码>var movies=\u context.Movie.AsNoTracking().Join(\u context.Watchhistory.Where(w=>w.WatchDate>=Convert.ToDateTime(DateTime.Now).AddDays(-14)).GroupBy(w=>w.MovieId).选择(m=>new{amount=m.Count(),mID=m.Key}).OrderByDescending(a=>a.amount).选择(a=>new{MovieId=a.mID}),m=>m.MovieId,w=>w.MovieId,(m,w=>m)代码>请参见编辑。
var q = from m in db.Movies
select new {m.MovieID,m.Name, amount = m.WatchHistory.Where( w => w.WatchDate >= ...).Count() };
var results = q.Where( m => m.amount > 0).OrderByDesc( m => m.amount).ToList();