Что под valuesVault.GetTable()
?
Возможно, у вас есть поставщик Linq, такой как Linq 2 SQL.
Это означает, что valuesVault.GetTable()
имеет тип IQueryable
, что, в свою очередь, означает, что весь запрос становится выражением .
Выражение - это запрос , который определен, но еще не выполнен.
Когда sequence
повторяется, запрос выполняетсяиспользуя поставщика Linq и этого поставщика Linq, и один из шагов, которые он должен выполнить, - выполнить это выражение: Guid.NewGuid()
.Большинство провайдеров Linq не могут передать это выражение в базовый источник (SQL Server не будет знать, что с ним делать), поэтому оно выполняется один раз, а результат выполнения возвращается с остальным результатом.
ЧтоВы можете сделать так, чтобы выражение valuesVault.GetTable()
стало collection , вызвав методы .ToList()
или .ToArray()
.При этом выполняется выражение и возвращается IEnumerable
, представляющий коллекцию в памяти.
При выполнении запросов к IEnumerable
выполнение не передается поставщику Linq, а выполняется средой выполнения .NET.
В вашем случае это означает, что выражение Guid.NewGuid()
может быть выполнено правильно.
Попробуйте это:
var sequence = from c in valuesVault.GetTable().ToArray()
select new {RandomIDX = Guid.NewGuid(), c.ID, c.Value};
Обратите внимание на .ToArray () там.Это то, что заставит оператор перейти от IQueryable
к IEnumerable
, и это изменит его поведение.