Ado.net EF 6.0 使用where的时候生成的SQL中为什么会有子查询。
数据表:
    public partial class MPM_tbAnalogContent 
    {
        public long ID { get; set; }
        public string AnalogListID { get; set; }
        public Nullable<decimal> MonitoringValue { get; set; }
        public Nullable<System.DateTime> LogTime { get; set; }
    }代码:
            var query = DataContext.MPM_tbAnalogContent.AsNoTracking().AsQueryable<MPM_tbAnalogContent>();
            
            if (string.IsNullOrWhiteSpace(EquipmentID) == false)
            {
                query = query.Where<MPM_tbAnalogContent>(p => p.AnalogListID == EquipmentID);
            }
            if (FromTime != null)
            {
                query = query.Where<MPM_tbAnalogContent>(p => FromTime <= p.LogTime);
            }
            if (ToTime != null)
            {
                query = query.Where<MPM_tbAnalogContent>(p => p.LogTime <= ToTime);
            }
            if (query != null)
            {
                query = query.OrderBy(p => p.LogTime);
                TableData = query.ToList<MPM_tbAnalogContent>();
            }生成的SQL:
{SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[AnalogListID] AS [AnalogListID], 
    [Extent1].[MonitoringValue] AS [MonitoringValue], 
    [Extent1].[AverageValue] AS [AverageValue], 
    [Extent1].[Minimumvalue] AS [Minimumvalue], 
    [Extent1].[Maximumvalue] AS [Maximumvalue], 
    [Extent1].[State] AS [State], 
    [Extent1].[LogTime] AS [LogTime]
    FROM (SELECT 
    [tbAnalogContent].[ID] AS [ID], 
    [tbAnalogContent].[AnalogListID] AS [AnalogListID], 
    [tbAnalogContent].[MonitoringValue] AS [MonitoringValue], 
    [tbAnalogContent].[AverageValue] AS [AverageValue], 
    [tbAnalogContent].[Minimumvalue] AS [Minimumvalue], 
    [tbAnalogContent].[Maximumvalue] AS [Maximumvalue], 
    [tbAnalogContent].[State] AS [State], 
    [tbAnalogContent].[LogTime] AS [LogTime]
    FROM [dbo].[tbAnalogContent] AS [tbAnalogContent]) AS [Extent1]
    WHERE (([Extent1].[AnalogListID] = @p__linq__0) OR (([Extent1].[AnalogListID] IS NULL) AND (@p__linq__0 IS NULL))) AND (@p__linq__1 <= [Extent1].[LogTime]) AND ([Extent1].[LogTime] <= @p__linq__2)}我想问一下为什么会生成的SQL语句中会有子查询。我不想要子查询,要直接的查询。
请教一下如何写代码能避免生成的SQL语句中包含子查询。
请用EF的Lambda方式写出代码,实在不行就用Linq,本菜鸟在此多谢。

解决方案 »

  1.   

    如果是加上了Orderby之后,又多嵌套了一个子查询。这是为什么呢,如何解决这个问题呢?{SELECT 
        [Project1].[ID] AS [ID], 
        [Project1].[AnalogListID] AS [AnalogListID], 
        [Project1].[MonitoringValue] AS [MonitoringValue], 
        [Project1].[AverageValue] AS [AverageValue], 
        [Project1].[Minimumvalue] AS [Minimumvalue], 
        [Project1].[Maximumvalue] AS [Maximumvalue], 
        [Project1].[State] AS [State], 
        [Project1].[LogTime] AS [LogTime]
        FROM ( SELECT 
            [Extent1].[ID] AS [ID], 
            [Extent1].[AnalogListID] AS [AnalogListID], 
            [Extent1].[MonitoringValue] AS [MonitoringValue], 
            [Extent1].[AverageValue] AS [AverageValue], 
            [Extent1].[Minimumvalue] AS [Minimumvalue], 
            [Extent1].[Maximumvalue] AS [Maximumvalue], 
            [Extent1].[State] AS [State], 
            [Extent1].[LogTime] AS [LogTime]
            FROM (SELECT 
        [tbAnalogContent].[ID] AS [ID], 
        [tbAnalogContent].[AnalogListID] AS [AnalogListID], 
        [tbAnalogContent].[MonitoringValue] AS [MonitoringValue], 
        [tbAnalogContent].[AverageValue] AS [AverageValue], 
        [tbAnalogContent].[Minimumvalue] AS [Minimumvalue], 
        [tbAnalogContent].[Maximumvalue] AS [Maximumvalue], 
        [tbAnalogContent].[State] AS [State], 
        [tbAnalogContent].[LogTime] AS [LogTime]
        FROM [dbo].[tbAnalogContent] AS [tbAnalogContent]) AS [Extent1]
            WHERE (([Extent1].[AnalogListID] = @p__linq__0) OR (([Extent1].[AnalogListID] IS NULL) AND (@p__linq__0 IS NULL))) AND (@p__linq__1 <= [Extent1].[LogTime]) AND ([Extent1].[LogTime] <= @p__linq__2)
        )  AS [Project1]
        ORDER BY [Project1].[LogTime] ASC}