2016-12-20 4 views
1

У меня возникли проблемы с попыткой сопоставить строковый столбец в базе данных с целым числом в моем приложении.Код первый Функции магазина в собственности

У меня есть база данных с коллекцией транспортных средств, когда таблица была создана, столбец года был указан как varchar. Мне нужно значение как целое число для выполнения расчетов с ним.

Я знаю, что могу использовать int.Parse, чтобы преобразовать его, но мне нужно, чтобы он работал в запросе фреймворка сущности. int.Parse не поддерживается в linq для сущностей, поэтому этот метод отсутствует.

Следующее, что я пробовал, - это создание представления и литье столбца в int. Это работало отлично, пока мне не пришлось писать в базу данных, тогда возникает ошибка, потому что представление содержит производное поле.

Что я пытался использовать в дальнейшем, используя библиотеку EntityFramework.CodeFirstStoreFunctions от Pawel Kadluczka. Это делает работу, но только тогда, когда я указываю его непосредственно, как это:

Store.Vehicles.Where(x => CustomSqlFunctions.ParseInt(x.ModelYear) == 2000) 

Где ParseInt определяется в C#, как

[CodeFirstDbFunction("ParseInt")] 
public static int ParseInt(string number) { 
    throw new NotSupportedException("Direct calls are not supported."); 
} 

Функция ParseInt в SQL просто вызывает cast(@p1 as int) где @ p1 является принятый в строка.

Мой вопрос:
Можно ли позвонить CustomSqlFunctions.ParseInt(ModelYear) из объекта в классе Vehicle ?.

Я попытался это:

public int? Year { 
    get { return CustomSqlFunctions.ParseInt(ModelYear); } 
    set { ModelYear = value.ToString(); } 
} 

, но я получаю ошибку, что год не поддерживается в LINQ для лиц

ответ

0

В итоге я понял. Это было довольно простое решение. Я вернулся к пользовательскому представлению с вычисленным столбцом. Однако на этот раз я сохранил исходное поле, которое называлось «ModelYear», и добавил столбец «Год», который будет отличным от строки до int.

год недвижимость в конце концов, выглядит следующим образом:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public int? Year { 
    get { return _year; } 
    set { 
     _year = value; 
     ModelYear = value.ToString(); 
    } 
} 

Когда значение установлено в год он также устанавливается в ModelYear в виде строки. Когда модель сохраняется в базе данных, поле ModelYear обновляется, и поскольку поле Year помечено как вычисленное, фреймворк также не пытается сохранить поле.

В качестве побочного примечания Год фактически не вызывался для начала. После перехода через исходный код для инфраструктуры Entity я обнаружил, что до того, как выражение оценивается, он сначала проверяет, является ли вызываемое свойство фактически отображаемым членом в базе данных. Поскольку Год не был отображен, выражение, содержащее Год, даже не оценивалось.

0

я предполагаю, что Year не отображается в базе данных. В этом случае вы выполняете эквивалент «литой» как таковой:

get 
{ 
    int value; 
    return int.TryParse(ModelYear, out value) ? value : null; 
} 
+0

К сожалению, это не сработает в моей ситуации, потому что int.Parse (и int.TryParse) нельзя перевести на функцию sql, которая будет использоваться в Linq для Entities. –