【发布时间】:2012-11-13 19:57:59
【问题描述】:
我正在使用 linq 从表和视图类中检索 MVC 4 中的数据。 如果我使用 linq 从视图中提取数据,如下所示:
db.vwContractMVC.Where(x => x.NID == id && x.Date >= pin && x.Date <= pen).ToList();
然后 linq 用这样的子查询构造 sql 查询:
SELECT
[Extent1].[NID] AS [NID],
[Extent1].[Date] AS [Date],
[Extent1].[Column1] AS [Column1],
[Extent1].[Column2] AS [Column2],
[Extent1].[Column3] AS [Column3]
FROM (SELECT
[vwContractMVC].[NID] AS [NID],
[vwContractMVC].[Date] AS [Date],
[vwContractMVC].[Column1] AS [Column1],
[vwContractMVC].[Column2] AS [Column2],
[vwContractMVC].[Column3] AS [Column3]
FROM [dbo].[vwContractMVC] AS [vwContractMVC]) AS [Extent1]
WHERE ([Extent1].[NID] = @p__linq__0) AND ([Extent1].[Date] >= @p__linq__1) AND ([Extent1].[Date] <= @p__linq__2)
如果使用表 - 查询很简单:
SELECT
[Extent1].[NID] AS [NID],
[Extent1].[Date] AS [Date],
[Extent1].[Column1] AS [Column1],
[Extent1].[Column2] AS [Column2],
[Extent1].[Column3] AS [Column3]
FROM [dbo].[Contract] AS [Extent1]
WHERE ([Extent1].[NID] = @p__linq__0) AND ([Extent1].[Date] >= @p__linq__1) AND ([Extent1].[Date] <= @p__linq__2)
问题是 - 如果可能的话,如何让 linq 从视图中进行简单的选择,当然)
我可以为此创建存储过程,但我希望使用现有的表和视图。
【问题讨论】:
-
你看过查询计划了吗?如果这两个生成不同的查询计划并执行任何不同的操作,我会感到惊讶。我不确定 LINQ 为什么要这样做,但通常 LINQ 并不总是生成最好的 SQL。如果生成的查询计划很差,问题就真的出现了——在这种情况下,我愿意打赌它们是一样的。
-
Eli Gassert,-是的,计划是相同的-但执行时间不同(不知道为什么,但确实不同)。这就是为什么我不想使用 linq 创建的子查询 - 它肯定会更慢,DB 很大,我应该避免这种模式。
-
哈姆雷特 Hakobyan,有关系吗?
-
使用存储过程并完成它。
-
Robert Slaney,我只是在寻找比创建一堆 SP 更好的解决方案。如果我没有找到 - 我肯定会使用程序。
标签: c# .net linq linq-to-entities