Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免linq中视图的子查询_C#_.net_Linq_Linq To Entities - Fatal编程技术网

C# 如何避免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

我使用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 [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]