Как обрезать использование значений Linq к Sql?

Существуют две проблемы с вашим сценарием SetValue:

  • Возвращение объекта
  • Объект ([Object]) против массива объектов ([Object[]])
  • ]

Возврат

Вы не можете вернуть назначение, подобное return $object.$p1 = $Value. Само присвоение ничего не возвращает с результатом, возвращающим $Null вызывающей стороне.
Кроме того, если вы возвращаете $Object для каждого рекурсивного вызова, вам нужно будет аннулировать ($Null = SetValue -object...) его каждым родительским вызывающим абонентом, чтобы он возвращался только верхнему вызывающему. но имейте в виду, что вы на самом деле тыкаете $NewValue в исходный ($JSON) объект !. Если вы не хотите этого, вам нужно выяснить, кто звонит, и только скопировать $Object на верхнем уровне перед рекурсивным вызовом.

Массив объектов

Вы не просто имеете дело со свойствами, содержащими отдельные объекты, но каждое свойство может потенциально содержать коллекцию объектов. Фактически, свойство листа SomeObject является примером этого. Это означает, что у каждого объекта в коллекции есть свой собственный уникальный набор свойств (который может иметь то же имя свойства, что и у родственного объекта):

$JSON = ConvertFrom-Json '{
   "key1":"key 1 value",
   "options":{
      "outDir":"./app-dir",
      "lib":[
         "someLibrary",
         "anotherLibrary"
      ],
      "someObjects":[
         {
            "first":"I am first"
         },
         {
            "first":"I am first too"
         },
         {
            "second":"I am second"
         }
      ]
   }
}'

Обратите внимание, что вы можете столкнуться с коллекция объектов на каждом уровне объекта Json.
Начиная с PSv3, у вас есть функция, называемая Перечисление членов , которая позволяет перечислять эти свойства в виде, например: ([Object[]]$SomeObject).First, но вы не можете просто установить (все) соответствующие свойства, подобные этому : ([Object[]]$SomeObject).First = $Value. (Вот почему ваша функция SetValue не работает, а ваша функция GetValue работает. Обратите внимание, что она на самом деле возвращает два элемента для приведенного выше примера Json I am first too ).

Ответ

Другими словами, вам нужно будет перебрать все коллекции объектов на каждом уровне, чтобы установить соответствующее свойство:

function SetValue($object, $key, $Value)
{
    $p1,$p2 = $key.Split(".",2)
    if($p2) { $object | ?{$Null -ne 

Существуют две проблемы с вашим сценарием SetValue:

  • Возвращение объекта
  • Объект ([Object]) против массива объектов ([Object[]])
  • ]

Возврат

Вы не можете вернуть назначение, подобное return $object.$p1 = $Value. Само присвоение ничего не возвращает с результатом, возвращающим $Null вызывающей стороне.
Кроме того, если вы возвращаете $Object для каждого рекурсивного вызова, вам нужно будет аннулировать ($Null = SetValue -object...) его каждым родительским вызывающим абонентом, чтобы он возвращался только верхнему вызывающему. но имейте в виду, что вы на самом деле тыкаете $NewValue в исходный ($JSON) объект !. Если вы не хотите этого, вам нужно выяснить, кто звонит, и только скопировать $Object на верхнем уровне перед рекурсивным вызовом.

Массив объектов

Вы не просто имеете дело со свойствами, содержащими отдельные объекты, но каждое свойство может потенциально содержать коллекцию объектов. Фактически, свойство листа SomeObject является примером этого. Это означает, что у каждого объекта в коллекции есть свой собственный уникальный набор свойств (который может иметь то же имя свойства, что и у родственного объекта):

[110]

Обратите внимание, что вы можете столкнуться с коллекция объектов на каждом уровне объекта Json.
Начиная с PSv3, у вас есть функция, называемая Перечисление членов , которая позволяет перечислять эти свойства в виде, например: ([Object[]]$SomeObject).First, но вы не можете просто установить (все) соответствующие свойства, подобные этому : ([Object[]]$SomeObject).First = $Value. (Вот почему ваша функция SetValue не работает, а ваша функция GetValue работает. Обратите внимание, что она на самом деле возвращает два элемента для приведенного выше примера Json I am first too ).

Ответ

Другими словами, вам нужно будет перебрать все коллекции объектов на каждом уровне, чтобы установить соответствующее свойство:

[111].$p1} | %{SetValue -object

Существуют две проблемы с вашим сценарием SetValue:

  • Возвращение объекта
  • Объект ([Object]) против массива объектов ([Object[]])
  • ]

Возврат

Вы не можете вернуть назначение, подобное return $object.$p1 = $Value. Само присвоение ничего не возвращает с результатом, возвращающим $Null вызывающей стороне.
Кроме того, если вы возвращаете $Object для каждого рекурсивного вызова, вам нужно будет аннулировать ($Null = SetValue -object...) его каждым родительским вызывающим абонентом, чтобы он возвращался только верхнему вызывающему. но имейте в виду, что вы на самом деле тыкаете $NewValue в исходный ($JSON) объект !. Если вы не хотите этого, вам нужно выяснить, кто звонит, и только скопировать $Object на верхнем уровне перед рекурсивным вызовом.

Массив объектов

Вы не просто имеете дело со свойствами, содержащими отдельные объекты, но каждое свойство может потенциально содержать коллекцию объектов. Фактически, свойство листа SomeObject является примером этого. Это означает, что у каждого объекта в коллекции есть свой собственный уникальный набор свойств (который может иметь то же имя свойства, что и у родственного объекта):

[110]

Обратите внимание, что вы можете столкнуться с коллекция объектов на каждом уровне объекта Json.
Начиная с PSv3, у вас есть функция, называемая Перечисление членов , которая позволяет перечислять эти свойства в виде, например: ([Object[]]$SomeObject).First, но вы не можете просто установить (все) соответствующие свойства, подобные этому : ([Object[]]$SomeObject).First = $Value. (Вот почему ваша функция SetValue не работает, а ваша функция GetValue работает. Обратите внимание, что она на самом деле возвращает два элемента для приведенного выше примера Json I am first too ).

Ответ

Другими словами, вам нужно будет перебрать все коллекции объектов на каждом уровне, чтобы установить соответствующее свойство:

[111].$p1 -key $p2 -Value $Value} } else { $object | ?{$Null -ne

Существуют две проблемы с вашим сценарием SetValue:

  • Возвращение объекта
  • Объект ([Object]) против массива объектов ([Object[]])
  • ]

Возврат

Вы не можете вернуть назначение, подобное return $object.$p1 = $Value. Само присвоение ничего не возвращает с результатом, возвращающим $Null вызывающей стороне.
Кроме того, если вы возвращаете $Object для каждого рекурсивного вызова, вам нужно будет аннулировать ($Null = SetValue -object...) его каждым родительским вызывающим абонентом, чтобы он возвращался только верхнему вызывающему. но имейте в виду, что вы на самом деле тыкаете $NewValue в исходный ($JSON) объект !. Если вы не хотите этого, вам нужно выяснить, кто звонит, и только скопировать $Object на верхнем уровне перед рекурсивным вызовом.

Массив объектов

Вы не просто имеете дело со свойствами, содержащими отдельные объекты, но каждое свойство может потенциально содержать коллекцию объектов. Фактически, свойство листа SomeObject является примером этого. Это означает, что у каждого объекта в коллекции есть свой собственный уникальный набор свойств (который может иметь то же имя свойства, что и у родственного объекта):

[110]

Обратите внимание, что вы можете столкнуться с коллекция объектов на каждом уровне объекта Json.
Начиная с PSv3, у вас есть функция, называемая Перечисление членов , которая позволяет перечислять эти свойства в виде, например: ([Object[]]$SomeObject).First, но вы не можете просто установить (все) соответствующие свойства, подобные этому : ([Object[]]$SomeObject).First = $Value. (Вот почему ваша функция SetValue не работает, а ваша функция GetValue работает. Обратите внимание, что она на самом деле возвращает два элемента для приведенного выше примера Json I am first too ).

Ответ

Другими словами, вам нужно будет перебрать все коллекции объектов на каждом уровне, чтобы установить соответствующее свойство:

[111].$p1} | %{

Существуют две проблемы с вашим сценарием SetValue:

  • Возвращение объекта
  • Объект ([Object]) против массива объектов ([Object[]])
  • ]

Возврат

Вы не можете вернуть назначение, подобное return $object.$p1 = $Value. Само присвоение ничего не возвращает с результатом, возвращающим $Null вызывающей стороне.
Кроме того, если вы возвращаете $Object для каждого рекурсивного вызова, вам нужно будет аннулировать ($Null = SetValue -object...) его каждым родительским вызывающим абонентом, чтобы он возвращался только верхнему вызывающему. но имейте в виду, что вы на самом деле тыкаете $NewValue в исходный ($JSON) объект !. Если вы не хотите этого, вам нужно выяснить, кто звонит, и только скопировать $Object на верхнем уровне перед рекурсивным вызовом.

Массив объектов

Вы не просто имеете дело со свойствами, содержащими отдельные объекты, но каждое свойство может потенциально содержать коллекцию объектов. Фактически, свойство листа SomeObject является примером этого. Это означает, что у каждого объекта в коллекции есть свой собственный уникальный набор свойств (который может иметь то же имя свойства, что и у родственного объекта):

[110]

Обратите внимание, что вы можете столкнуться с коллекция объектов на каждом уровне объекта Json.
Начиная с PSv3, у вас есть функция, называемая Перечисление членов , которая позволяет перечислять эти свойства в виде, например: ([Object[]]$SomeObject).First, но вы не можете просто установить (все) соответствующие свойства, подобные этому : ([Object[]]$SomeObject).First = $Value. (Вот почему ваша функция SetValue не работает, а ваша функция GetValue работает. Обратите внимание, что она на самом деле возвращает два элемента для приведенного выше примера Json I am first too ).

Ответ

Другими словами, вам нужно будет перебрать все коллекции объектов на каждом уровне, чтобы установить соответствующее свойство:

[111].$p1 = $Value} } } SetValue -object $JSON -key $SearchPath -Value $NewValue $Json | ConvertTo-Json -Depth 5 { "key1": "key 1 value", "options": { "outDir": "./app-dir", "lib": [ "someLibrary", "anotherLibrary" ], "someObjects": [ { "first": "I am a new value" }, { "second": "I am second" } ] } }

8
задан Marsharks 16 March 2009 в 20:13
поделиться

5 ответов

Возможно, Вы могли поместить его в OnLoaded () частичный метод?Примечание: Я никогда не использовал это, но я предполагаю, что это было бы похоже на это:

public partial class Contact
{
    partial void OnLoaded()
    {
        FirstName = FirstName.Trim();
    }
}
8
ответ дан 5 December 2019 в 10:44
поделиться

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

public partial class Contact
{

    public string RealFirstName
    {
       get { return this.FirstName.Trim(); }
       set { this.FirstName = value; }
    }

    ...
}
6
ответ дан 5 December 2019 в 10:44
поделиться
Contact contact = db.Contacts.Single(c => c.Id.Trim() == myId);

И проверьте, что поставщик LINQ переводит это в соответствующий SQL.

1
ответ дан 5 December 2019 в 10:44
поделиться

Это зависит от контроля, который Вы имеете над схемой и кодом.

Если значения настраиваются путем вызова конструктора со всеми параметрами, сделайте обрезки, и т.д. поскольку они присвоены членским переменным.

Если они присваиваются свойствам (вероятно, от примера), изменяют средство доступа НАБОРА так, чтобы это сделало обрезку там.

У Вас действительно есть потенциальные проблемы, если Вы на самом деле ХОТИТЕ вести или конечные пробелы в какой-то момент все же.

Если Вы не можете изменить код базового класса, попытайтесь использовать частичные классы, или наследоваться классу и переопределить свойства там.

Если бы Вы не можете сделать этого, то мое последнее предложение состояло бы в том, чтобы записать какой-то класс фабрики, которому Вы передаете созданный объект, и оно очищает его на правила, которые Вы хотите.

1
ответ дан 5 December 2019 в 10:44
поделиться

Можно выполнить a ForEach в Вашем списке контактов прежде, чем попытаться искать Martin.

var contacts = db.Contacts.ForEach(c => c.FirstName = c.FirstName.Trim());
Contact contact = contacts.Single(c => c.Id == myId);
contact.FirstName // = "Martin"

Но этот путь не очень легко поддержать, если он должен быть сделан для нескольких полей.

0
ответ дан 5 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: