C# 需要实体框架查询来生成SQL
我有两张表C# 需要实体框架查询来生成SQL,c#,sql,linq,entity-framework,optimization,C#,Sql,Linq,Entity Framework,Optimization,我有两张表A和BA与B以一对多的形式关联(A包含B的集合) 如何创建实体框架以生成下一个SQL(我应该编写什么linq查询): 从A.UserId中选择A.UserId,计数(B.ID) A.ID=B.A\U ID上的左连接B 其中B.当我改变你的ef clouse时,得分 from a in db.A.DefaultIfEmpty() join b in db.B on a.ID equals b.A_ID where b.Score <
A
和B
<代码>A与B
以一对多的形式关联(A
包含B
的集合)
如何创建实体框架以生成下一个SQL(我应该编写什么linq查询):
从A.UserId中选择A.UserId,计数(B.ID)
A.ID=B.A\U ID上的左连接B
其中B.当我改变你的ef clouse时,得分
from a in db.A.DefaultIfEmpty()
join b in db.B
on a.ID equals b.A_ID
where b.Score <= 6
group a by a.UserId into grouping
select new
{
UserId = (string) grouping.Key,
RawValue = grouping.Count()
};
来自db.a.DefaultIfEmpty()中的
在db.b中加入b
在a.ID上等于b.a_ID
b.Score你能复制粘贴生成的SQL吗?@Jordi刚刚用生成的SQL更新了你正在分组,在分组中你正在做计数和。因此,这不是一个简单的查询开始。您是否尝试过使用工具分析查询?看看它在执行的时候到底在做什么?因为服务器会进行各种优化。“它会返回我所需要的”它不会,它在语义上与原始查询不同。@usr您能告诉我为什么不吗?
from a in db.A
join b in db.B
on a.ID equals b.A_ID
where b.Score <= 6
group a by a.UserId into grouping
select new
{
UserId = (Guid) grouping.Key,
RawValue = grouping.Sum(x => x.Bs.Count())
};
SELECT
1 AS [C1],
[Project3].[UserId] AS [UserId],
CAST( [Project3].[C1] AS float) AS [C3]
FROM ( SELECT
[Project2].[UserId] AS [UserId],
(SELECT
SUM([Filter2].[A1]) AS [A1]
FROM ( SELECT
(SELECT
COUNT(1) AS [A1]
FROM [dbo].[B] AS [Extent5]
WHERE [Extent3].[ID] = [Extent5].[A_ID]) AS [A1]
FROM [dbo].[A] AS [Extent3]
INNER JOIN [dbo].[B] AS [Extent4] ON [Extent3].[ID] = [Extent4].[A_ID]
WHERE ([Extent4].[Score] <= 6)
) AS [Filter2]) AS [C1]
FROM ( SELECT
[Distinct1].[UserId] AS [UserId]
FROM ( SELECT DISTINCT
[Extent1].[UserId] AS [UserId]
FROM [dbo].[A] AS [Extent1]
INNER JOIN [dbo].[B] AS [Extent2] ON [Extent1].[ID] = [Extent2].[A_ID]
WHERE ([Extent2].[Score] <= 6)
) AS [Distinct1]
) AS [Project2]
) AS [Project3]
from a in db.A.DefaultIfEmpty()
join b in db.B
on a.ID equals b.A_ID
where b.Score <= 6
group a by a.UserId into grouping
select new
{
UserId = (string) grouping.Key,
RawValue = grouping.Count()
};
SELECT
1 AS [C1],
[GroupBy1].[K1] AS [UserId],
[GroupBy1].[A1] AS [C2]
FROM ( SELECT
[Extent1].[UserId] AS [K1],
COUNT(1) AS [A1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
LEFT OUTER JOIN [dbo].[A] AS [Extent1] ON 1 = 1
INNER JOIN [dbo].[B] AS [Extent2] ON [Extent1].[ID] = [Extent2].[A_ID]
WHERE [Extent2].[Score] <= 6
GROUP BY [Extent1].[UserId]
) AS [GroupBy1]