Если кто-то ищет Linq verson, это работает для меня:
public static IQueryable<BlockVersion> LatestVersionsPerBlock(this IQueryable<BlockVersion> blockVersions)
{
var max_version_per_id = blockVersions.GroupBy(v => v.BlockId)
.Select( v => new { BlockId = v.Key, MaxVersion = v.Max(x => x.Version) } );
return blockVersions.Where( v => max_version_per_id.Any(x => x.BlockId == v.BlockId && x.MaxVersion == v.Version) );
}
Да, вам нужны кавычки. Это упрощает и позволяет избежать использования другого метода escape для зарезервированных ключевых слов javascript, то есть {for:"foo"}
.
Из 2.2. Объекты
Структура объекта представлена в виде пары фигурных скобок, окружающих ноль или несколько пар имен / значений (или членов). Имя - это строка.
blockquote>и от 2.5. Строки
Строка начинается и заканчивается кавычками.
blockquote>Поэтому я бы сказал, что в соответствии со стандартом: да, вы всегда должны указывать ключ ( хотя некоторые парсеры могут быть более прощающими)
Вы правильно используете строки в качестве ключа. Вот отрывок из RFC 4627 - Тип приложения / json Media для нотации объектов JavaScript (JSON)
2.2. Объекты
Структура объекта представлена в виде пары фигурных скобок, окружающих ноль или несколько пар имен / значений (или членов). Имя - это строка. Каждое двоеточие появляется после каждого имени, отделяя имя от значения. Одна запятая отделяет значение от следующего имени. Имена внутри объекта СЛЕДУЕТ быть уникальными.
object = begin-object [ member *( value-separator member ) ] end-object
member = string name-separator value
[...]
2.5. Строки
Представление строк аналогично соглашениям, используемым в семействе языков программирования C. Строка начинается и заканчивается кавычками. [...]
string = quotation-mark *char quotation-mark
quotation-mark = %x22 ; "
Прочитайте весь RFC здесь .
Поскольку вы можете поместить «parent.child» пунктирную нотацию, и вам не нужно помещать родительский [«child»], который также действителен и полезен, я бы сказал, что оба способа являются технически приемлемыми. Парсеры должны делать все в порядке. Если вашему парсеру не нужны кавычки на клавишах, то, вероятно, лучше не ставить их (экономит место). Имеет смысл называть их строками, потому что это то, что они есть, и поскольку квадратные скобки дают вам возможность использовать значения для ключей, по сути, это совершенно бесполезно. В Json вы можете поместить ...
>var keyName = "someKey";
>var obj = {[keyName]:"someValue"};
>obj
Object {someKey: "someValue"}
просто отлично, без проблем, если вам нужно значение для ключа, и ни одно цитируемое не будет работать, поэтому, если это не так, вы не можете , поэтому вы не будете так «вам не нужны кавычки на клавишах». Даже если правильно сказать, что они технически струны. Логика и использование утверждают иначе. Также он официально не выводит Object {"someKey": "someValue"} для obj в нашем примере запускается с консоли любого браузера.
Да, котировки являются обязательными. http://json.org/ говорит:
string
""
" chars "