У меня есть проект VS2010 с классами Linq-to-SQL, сгенерированный из базы данных SQL 2008. Относительно таблица имеет специальный Created столбец, это Колум имеет типа DateTimeOffset (3) и используется в качестве partioning ключа на ежедневной основе:Как определить точность DateTimeOffset с Linq-to-Sql
CREATE TABLE [dbo].[tableA](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Created] [datetimeoffset](3) NOT NULL,
[A] [int] NULL,
CONSTRAINT [PK_TableA] PRIMARY KEY CLUSTERED
(
[Created] ASC,
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) on partScheme_Daily_OnCreatedDate (Created)
) on partScheme_Daily_OnCreatedDate (Created)
Сформированный LINQ к SQL-код для этого столбца show DateTimeOffset как его тип.
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.TableA")]
public partial class TableA : INotifyPropertyChanging, INotifyPropertyChanged {
private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
private int _Id;
private System.DateTimeOffset _Created;
etc
Я могу создать и выполнить запрос linq-to-sql на основе этих сгенерированных классов.
var query = db.TableA.Where(pt => pt.Created >= (DateTimeOffset) startTime && pt.Created <= endTime
Это означает правильный SQL-запрос, но тип на стороне SQL DateTimeOffset (7). Поэтому база данных не использует оптимальное удаление разделов и доступ ко всем разделам. Если я изменил тип DateTimeOffset (3) на основе захваченного SQL-запроса и выполнил его в SSMS, он будет использовать исключение раздела.
exec sp_executesql N'SELECT TOP (10001) [t0].[Id], [t0].[Created],
FROM [dbo].[TableA] AS [t0]
WHERE ([t0].[Created] >= @p0) AND ([t0].[Created] <= @p1)
ORDER BY [t0].[Created] DESC',N'@p0 datetimeoffset(3),@p1 datetimeoffset(3)',@p0='2015-02-27 23:00:00 +00:00',@p1='2015-03-03 22:59:59 +00:00'
Итак, как получить оптимальное удаление разделов? В моем примере мне нужен доступ не более чем к 2 разделам.
Я думал о создании хранимой процедуры, но это означало бы, что я теряю гибкость в изменении запроса легко в коде C#. Другим решением будет изменение типа SQL созданного столбца в DateTimeOffset (7). Но недостатком этого было бы хранение избыточных данных точности, которых у меня на самом деле нет.
Я хотел бы услышать другие возможности, либо проинструктируя linq-to-sql генерировать DateTimeOffset (3) как тип переменной SQL, либо другой способ сделать исключение раздела эффективным.
PS: Я упростил определение таблицы и запросы для краткого определения проблемы.
.Net использует шкалу 7, вы хотите использовать 3 ... компромисс ... игнорировать вопрос, посмотреть на их решение ... http://stackoverflow.com/questions/510384/how -do-i-stop-the-datetimeoffset-scale-from-cause-a-changeconflictexception-in –