Как использовать TRUNC в EntitySchema

Добрый день.
Пример:

EntitySchema entitySchema = UserConnection.EntitySchemaManager.GetInstanceByName("Account");
EntitySchemaQuery entitySchemaQuery = new EntitySchemaQuery(entitySchema);
entitySchemaQuery.AddColumn("Name").OrderByAsc();
entitySchemaQuery.AddColumn("Significance.Name");
entitySchemaQuery.AddColumn("TariffCategory.Name");

var groupFilter = new EntitySchemaQueryFilterCollection(entitySchemaQuery, LogicalOperationStrict.And);


strong>Здесь делаю фильтр:strong>, поле CreatedOn содержит не только дату и еще время
groupFilter.Add(entitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.GreaterOrEqual,
                                                                                        "CreatedOn", startDate));

мне надо чтобы рассекал время делал проверку только на дату

Sql Запрос примерно такой:

SELECT   a."Name" AS "AccountName", s."Name" AS "SignificanceName",
         t."Name" AS "TariffCategoryName"
FROM     "Account" a
INNER JOIN  "SignificanceLevel" s
        ON  s."Id" = a."SignificanceId"
INNER JOIN  "TariffCategory" t
        ON  t."Id" = a."TariffCategoryId"
WHERE   TRUNC(a."CreatedOn") = TO_DATE('11.04.2012', 'dd.mm.yyyy')

Нравится

6 комментариев

Здравствуйте.
Можно использовать свойство TrimDateTimeParameterToDate у EntitySchemaQueryFilter, например:

EntitySchema entitySchema = UserConnection.EntitySchemaManager.GetInstanceByName("Account");
EntitySchemaQuery entitySchemaQuery = new EntitySchemaQuery(entitySchema);
entitySchemaQuery.AddColumn("Name").OrderByAsc();
entitySchemaQuery.AddColumn("Significance.Name");
entitySchemaQuery.AddColumn("TariffCategory.Name");
 
var groupFilter = new EntitySchemaQueryFilterCollection(entitySchemaQuery, LogicalOperationStrict.And);
var filter =(EntitySchemaQueryFilter)entitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "CreatedOn", startDate);
filter.TrimDateTimeParameterToDate = true;
groupFilter.Add(filter);

Приблизительный вид получившегося sql запроса:

SELECT   a."Name" AS "AccountName", s."Name" AS "SignificanceName",
         t."Name" AS "TariffCategoryName"
FROM     "Account" a
INNER JOIN  "SignificanceLevel" s
        ON  s."Id" = a."SignificanceId"
INNER JOIN  "TariffCategory" t
        ON  t."Id" = a."TariffCategoryId"
WHERE   (a."CreatedOn" >= TO_TIMESTAMP('2012-04-11 12:00:00.000', 'YYYY-MM-DD HH24:MI:SS.FF3') AND a."CreatedOn" < TO_TIMESTAMP('2012-04-12 12:00:00.000', 'YYYY-MM-DD HH24:MI:SS.FF3'))

"Серебрянский Глеб Игоревич" написал:

Здравствуйте.

Можно использовать свойство TrimDateTimeParameterToDate у EntitySchemaQueryFilter, например:

EntitySchema entitySchema = UserConnection.EntitySchemaManager.GetInstanceByName("Account");

EntitySchemaQuery entitySchemaQuery = new EntitySchemaQuery(entitySchema);

entitySchemaQuery.AddColumn("Name").OrderByAsc();

entitySchemaQuery.AddColumn("Significance.Name");

entitySchemaQuery.AddColumn("TariffCategory.Name");



var groupFilter = new EntitySchemaQueryFilterCollection(entitySchemaQuery, LogicalOperationStrict.And);

var filter =(EntitySchemaQueryFilter)entitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "CreatedOn", startDate);

filter.TrimDateTimeParameterToDate = true;

groupFilter.Add(filter);

Приблизительный вид получившегося sql запроса:

SELECT   a."Name" AS "AccountName", s."Name" AS "SignificanceName",

         t."Name" AS "TariffCategoryName"

FROM     "Account" a

INNER JOIN  "SignificanceLevel" s

        ON  s."Id" = a."SignificanceId"

INNER JOIN  "TariffCategory" t

        ON  t."Id" = a."TariffCategoryId"

WHERE   (a."CreatedOn" >= TO_TIMESTAMP('2012-04-11 12:00:00.000', 'YYYY-MM-DD HH24:MI:SS.FF3') AND a."CreatedOn" < TO_TIMESTAMP('2012-04-12 12:00:00.000', 'YYYY-MM-DD HH24:MI:SS.FF3'))

Спасибо,а в следующим коде TRUNC как сделать?

Select Sel = new Select(userConnection)
           .Column("a", "Name").As("AccountName")
           .Column("s", "Name").As("SignificanceName")
           .Column("t", "Name").As("TariffCategoryName")
           .From("Account").As("a")
           .InnerJoin("SignificanceLevel").As("s").On("s", "Id").IsEqual("a", "SignificanceId")
           .InnerJoin("TariffCategory").As("t").On("t", "Id").IsEqual("a", "TariffCategoryId") 
           .Where("a", "BusinessTypeId").IsEqual(new QueryParameter(new Guid("{7FBD1F94-F36B-1410-8E87-485B39B216BB}"))) 
           .And("a", "CreatedOn").IsGreaterOrEqual(new QueryParameter(startDate)) 
           .And("a", "CreatedOn").IsLessOrEqual(new QueryParameter(endDate))
as Select;

Непосредственно Select данной функциональности не содержит, так как он в отличии от EntitySchemaQuery не проводит дополнительного анализа запроса, а просто строит запрос как есть. Если нужно использовать TRUNC, и по каким-то причинам нельзя использовать EntitySchemaQuery, можно сделать так:

string sqlText = "SELECT a.\"Name\"" AS \""AccountName\"""" +

[quote="Серебрянский Глеб Игоревич"]

Непосредственно Select данной функциональности не содержит, так как он в отличии от EntitySchemaQuery не проводит дополнительного анализа запроса, а просто строит запрос как есть. Если нужно использовать TRUNC, и по каким-то причинам нельзя использовать EntitySchemaQuery, можно сделать так:

string sqlText = "SELECT a.\"Name\"" AS \""AccountName\"""" +

Права доступа накладываются автоматически только при использовании EntitySchemaQuery. Select генерирует строго тот запрос, который был с его помощью сконструирован. Если нужно автоматическое наложение прав доступа, и автоматическое игнорирование времени в параметре дата/время, необходимо использовать EntitySchemaQuery.

"Серебрянский Глеб Игоревич" написал:

Права доступа накладываются автоматически только при использовании EntitySchemaQuery. Select генерирует строго тот запрос, который был с его помощью сконструирован. Если нужно автоматическое наложение прав доступа, и автоматическое игнорирование времени в параметре дата/время, необходимо использовать EntitySchemaQuery.

я сделал таким образом:

EntitySchema entitySchema = userConnection.EntitySchemaManager.GetInstanceByName("Account");
EntitySchemaQuery entitySchemaQuery = new EntitySchemaQuery(entitySchema);
var AccountName = entitySchemaQuery.AddColumn("Name").Name;
var SignificanceName = entitySchemaQuery.AddColumn("=Significance.Name").Name;
var TariffCategoryName = entitySchemaQuery.AddColumn("=TariffCategory.Name").Name;
 
var groupFilter = new EntitySchemaQueryFilterCollection(entitySchemaQuery, LogicalOperationStrict.And);
 
groupFilter.Add(entitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.Equal,
                                                                 "BusinessType", Guid.Parse(businessTypeId)));
 
if((startDate.ToString("dd.MM.yyyy") != DateTime.MinValue.ToString("dd.MM.yyyy"))&& (endDate.ToString("dd.MM.yyyy") != DateTime.MinValue.ToString("dd.MM.yyyy")))
{
   var FilterDateGE =(EntitySchemaQueryFilter)entitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.GreaterOrEqual, "CreatedOn", startDate);
FilterDateGE.TrimDateTimeParameterToDate = true;
var FilterDateLE =(EntitySchemaQueryFilter)entitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.LessOrEqual, "CreatedOn", endDate);
FilterDateLE.TrimDateTimeParameterToDate = true;
groupFilter.Add(FilterDateGE);
groupFilter.Add(FilterDateLE);
 
string lblSectionDate = "Период с " + startDate.ToString("dd.MM.yyyy") +" по "+endDate.ToString("dd.MM.yyyy");
   }

Получаем запрос, я здесь не вижу как TRUNC("Account"."CreatedOn") :

SELECT
	"Account"."Name" "Name",
	"Significance"."Name" "Significance.Name",
	"TariffCategory"."Name" "TariffCategory.Name"
FROM
	"PRODDB"."Account" "Account",
	"PRODDB"."SignificanceLevel" "Significance",
	"PRODDB"."TariffCategory" "TariffCategory"
WHERE
	(1 = 1
	AND ("Account"."BusinessTypeId" = '{7FBD1F94-F36B-1410-8E87-485B39B216BB}'
	AND "Account"."CreatedOn" >= :P2
	AND "Account"."CreatedOn" <= :P3))
	AND "Significance"."Id" = "Account"."SignificanceId"
	AND "TariffCategory"."Id" = "Account"."TariffCategoryId"
Показать все комментарии