2015-03-03 3 views
0

У меня есть проект 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: Я упростил определение таблицы и запросы для краткого определения проблемы.

+0

.Net использует шкалу 7, вы хотите использовать 3 ... компромисс ... игнорировать вопрос, посмотреть на их решение ... http://stackoverflow.com/questions/510384/how -do-i-stop-the-datetimeoffset-scale-from-cause-a-changeconflictexception-in –

ответ

0

Используйте DateTimeOffset.ToString форматирование по своему желанию.

DateTimeOffset outputDate = new DateTimeOffset(2007, 11, 1, 9, 0, 0, 
           new TimeSpan(-7, 0, 0)); 
string format = "dddd, MMM dd yyyy HH:mm:ss zzz"; 

// Output date and time using custom format specification 
Console.WriteLine(outputDate.ToString(format, null as DateTimeFormatInfo)); 
Console.WriteLine(outputDate.ToString(format, CultureInfo.InvariantCulture)); 
Console.WriteLine(outputDate.ToString(format, 
            new CultureInfo("fr-FR"))); 
Console.WriteLine(outputDate.ToString(format, 
            new CultureInfo("es-ES"))); 
// The example displays the following output to the console: 
// Thursday, Nov 01 2007 09:00:00 -07:00 
// Thursday, Nov 01 2007 09:00:00 -07:00 
// jeudi, nov. 01 2007 09:00:00 -07:00 
// jueves, nov 01 2007 09:00:00 -07:00 
+0

Спасибо за ваш ответ, я знаю, как избавиться от точности dotnet. Но то, что я хотел бы видеть, - это способ для linq-to-sql перевода dotnet DateTimeOffset в sql DateTimeOffset (3) вместо DateTimeOffset (7). – Ako

+0

@Ako У вас есть файл DBML? Это немного перебор, но вы задумались о создании карты пользовательского типа? https://msdn.microsoft.com/en-us/library/vstudio/cc716764%28v=vs.100%29.aspx –

+0

Спасибо, Пол, я проверю это. Тип в DBML перенаправлен: <Название столбца = "Id" Тип = "System.Int32" DbType = "Int NOT NULL IDENTITY" IsPrimaryKey = "true" IsDbGenerated = "true" CanBeNull = "false" /> < Column Name = "Created" Type = "System.DateTimeOffset" DbType = "DateTimeOffset NOT NULL" IsPrimaryKey = "true" CanBeNull = "false" /> – Ako