C# 如何避免linq中视图的子查询
我使用linq从表和视图类中检索MVC4中的数据。 如果我使用linq从视图中提取数据,如下所示:C# 如何避免linq中视图的子查询,c#,.net,linq,linq-to-entities,C#,.net,Linq,Linq To Entities,我使用linq从表和视图类中检索MVC4中的数据。 如果我使用linq从视图中提取数据,如下所示: db.vwContractMVC.Where(x => x.NID == id && x.Date >= pin && x.Date <= pen).ToList(); SELECT [Extent1].[NID] AS [NID], [Extent1].[Date] AS [Date], [Extent1].[Column1] AS [C
db.vwContractMVC.Where(x => x.NID == id && x.Date >= pin && x.Date <= pen).ToList();
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)
db.vwContractMVC.Where(x=>x.NID==id&&x.Date>=pin&&x.Date=@p\u linq\u 1)和([Extent1].[Date]=@p\u linq\u 1)和([Extent1].[Date]实际SQL是通过子查询创建的,因为您是从视图中选择的。如果您不是多次从同一视图中选择,只需从实际表中创建linq查询,否则您可以创建一个返回视图SQL AsQueryable()的方法,并根据需要添加where子句
代码:
正在使用子查询创建实际SQL,因为您是从视图中选择的。如果您不是多次从同一视图中选择,请从实际表中创建linq查询,否则您可以创建一个返回视图SQL AsQueryable()的方法,并根据需要添加where子句
代码:
你看过查询计划了吗?如果这两个生成不同的查询计划并执行不同的操作,我会感到惊讶。我不确定LINQ为什么会这样做,但一般来说,LINQ并不总是生成最好的SQL。如果生成的查询计划很差,那么问题真的会出现——在这种情况下,我愿意打赌它们是最好的相同。Eli Gassert,-是的,计划是相同的-但执行时间不同(不知道为什么,但确实不同).这就是为什么我不想使用linq创建的子查询-它肯定会比较慢,DB相当大,我应该避免这种模式。Hamlet Hakobyan,这有关系吗?使用存储过程并完成它。Robert Slaney,我只是在寻找一个比创建一堆SP更好的解决方案。如果我找不到它,我肯定会使用过程s、 你看过查询计划了吗?如果这两个查询计划生成不同的查询计划并执行不同的操作,我会感到惊讶。我不确定LINQ为什么会这样做,但一般来说,LINQ并不总是生成最好的SQL。如果生成的查询计划很差,那么问题真的会出现——在这种情况下,我愿意打赌它们是e same.Eli Gassert,-是的,计划是相同的-但执行时间不同(不确定为什么,但确实不同).这就是为什么我不想使用linq创建的子查询-它肯定会比较慢,DB相当大,我应该避免这种模式。Hamlet Hakobyan,这有关系吗?使用存储过程并完成它。Robert Slaney,我只是在寻找一个比创建一堆SP更好的解决方案。如果我找不到它,我肯定会使用过程s
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)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LinqToView
{
class Program
{
static void Main(string[] args)
{
using (var context = new NWEntities())
{
ViewQuery(context).Where(vw => vw.Product == "Foo").ToList();
}
}
private static IQueryable<vwProducts_by_Categories> ViewQuery(NWEntities context)
{
return
from p in context.Products
join c in context.Categories on p.CategoryID equals c.CategoryID
select new vwProducts_by_Categories { Product = p.ProductName, Category = c.CategoryName };
}
}
public class vwProducts_by_Categories
{
public string Product { get; set; }
public string Category { get; set; }
}
}
SELECT
[Extent2].[CategoryID] AS [CategoryID],
[Extent1].[ProductName] AS [ProductName],
[Extent2].[CategoryName] AS [CategoryName]
FROM [dbo].[Products] AS [Extent1]
INNER JOIN [dbo].[Categories] AS [Extent2] ON [Extent1].[CategoryID] = [Extent2].[CategoryID]
WHERE N'Foo' = [Extent1].[ProductName]