#c# #asp.net #linq #linq-to-sql
#c# #asp.net #linq #linq-to-sql
Вопрос:
Имеет больше смысла использовать целое число в базе данных, но я хочу притвориться, что это всегда была строка (а не строка, соответствующая int), потому что это проще.
Причина этого в том, что пользовательский вид представляет собой зашифрованную версию строки, но я никогда не хочу видеть int, если не работаю напрямую с базой данных (int — это столбец идентификатора).
Итак, у меня есть сопоставление LINQ, которое я хочу заменить. В принципе, я хочу заменить это (которое есть в конструкторе)
[global::System.Data.Linq.Mapping.ColumnAttribute] //...
public int TID
{
get
{
return this._TID;
}
set
{
if ((this._TID != value))
{
this.OnTIDChanging(value);
this.SendPropertyChanging();
this._TID = value;
this.SendPropertyChanged("TID");
this.OnTIDChanged();
}
}
}
С помощью этого
[global::System.Data.Linq.Mapping.ColumnAttribute] //...
public string TID
{
get
{
return Convert.ToString(this._TID 5);
}
set
{
if ((this._TID - 5 != Int32.Parse(value)))
{
this.OnTIDChanging(value);
this.SendPropertyChanging();
this._TID = Int32.Parse(value) - 5;
this.SendPropertyChanged("TID");
this.OnTIDChanged();
}
}
}
Это позволило бы мне, например, использовать a asp:QueryStringParameter
вместо WhereParameters
a LinqDataSource
вместо переназначения строки запроса в исходном коде.
Комментарии:
1. Вам следует быть осторожным с ответом @Chad, если вы выполняете запрос Linq2SQL к этому свойству, потому что L2S предположит, что это столбец в таблице, и выдаст ошибку, когда не найдет ее
2. @Jose: Это, вероятно, можно было бы решить с помощью LinqKit, но с
LinqDataSource
это не помогает.
Ответ №1:
Вместо переназначения подобным образом попробуйте расширить класс linq и добавить новое свойство к классу
Public string TIDstring
{
get { return (this.TID 5).toString(); }
set
{
int val = 0;
if (int.TryParse(value, out val)
this.TID = val - 5;
else
throw new Exception("Invalid TID Value")
}
}
Комментарии:
1. Вот почему все классы linq to sql являются частичными классами, вы можете расширить их в другом файле без перезаписи, если вы повторно создадите класс entity.
2. Спасибо. По какой-то причине мой мозг решил, что только сам DataContext является частичным классом, хотя код конструктора был открыт прямо передо мной.
3. На самом деле это не решает проблему полностью, потому что мое новое свойство «не поддерживает перевод в SQL». Таким образом, это очень помогает, но не устраняет проблему с необходимостью обработки
asp:QueryStringParameter
в коде (например, вWhereParameters
элементе).4. Я знаю, это не то, что вы хотите, но вы могли бы вставить значение в скрытое поле при загрузке страницы и использовать управляющий параметр.
5. Это выглядит лучше, но я думаю, что с моральной точки зрения это эквивалентно тому, что я делаю сейчас (т. Е. Вычисляю значение в исходном коде). Я подозреваю, что это неразрешимо. Я пытаюсь запустить перевод для параметра запроса и использовать его для сравнения с базой данных, тогда как Linq больше предназначен для запуска перевода в столбце базы данных и сравнения его с параметром запроса. Я не думаю, что это поддерживает оба, и подозреваю, что тот факт, что я хочу это сделать, намекает на то, что у меня нет сильной интуиции о том, как работает it LINQ.
Ответ №2:
Как насчет использования вашего Where
свойства SqlDataSource
, чтобы сделать что-то вроде этого:
Where = "it.[TID] = (@TID - 5)"
Комментарии:
1. Идея пришла ко мне в эти выходные, опубликованная как отдельный ответ, потому что она отличается от приведенной выше.
2. Как уже упоминалось, то, что я на самом деле делаю, это шифрование целого числа и использование строкового представления результата. Я не думаю, что предложение
LinqDataSource
where может справиться с этим.3. Если у вас не было функции дешифрования, то на вашем sql server параметр QueryStringParameter у вас работать не будет.
4. Я вставил шифрование и дешифрование в свои функции get / set, во многом таким же образом, как вы добавили / вычли 5 в функциях get / set вашего другого ответа.