В чем разница между приведенными анонимными типами?
От: Аноним  
Дата: 23.06.09 17:39
Оценка:
Ниже привожу строковое описание (то что показывает отладчик) анонимных типов.

1). new <>f__AnonymousType0`2(Val1 = v.DueDate, val2 = v.rowguid)
(полный запрос: {value(System.Data.Objects.ObjectQuery`1[BusinessObjects.SalesOrderHeader]).Select(v => new <>f__AnonymousType0`2(Val1 = v.DueDate, val2 = v.rowguid))})

2). new <>f__AnonymousType0(Val1 = v.DueDate, val2 = v.rowguid)
(полный запрос: {value(System.Data.Objects.ObjectQuery`1[BusinessObjects.SalesOrderHeader]).Select(v => new <>f__AnonymousType0(Val1 = v.DueDate, val2 = v.rowguid)).FirstOrDefault()})

Первое описание получено непосредственно из Expresion от LINQ-запроса (к EntityFramework). Второе описание получено после сериализации/десериализации этого Expression.
Если выполнять запрос на клиенте (вариант 1), то он выполняется нормально. Если же выполнять запрос на сервере (вариант 2, запрос на клиенте сериализуется, на сервере десериализуется), то вываливается исключение, что "тип не имеет свойства или поля Val1".
Визуально разница вида только в наличии в первом варианте "`2". Я так полагаю, что именно эта штука показывает, что анонимный тип имеет два свойства. Но почему-то после десериализации этого нету.
Создается Expression для анонимного типа на сервере при десериализации вот так "Expression.New(constructor, arguments, members)", где constructor — это конструктор типа с двумя параметрами. arguments — аргументы, которые передаются конструктору, members — свойства. Тут вроде все нормально — аргумента 2, и они нужных типов, членов тоже два, и они нужных типов, но вот почему-то при попытке выполнить запрос валится исключение, что нету таких свойств.
Вопрос собственно, что нужно сделать, чтобы после десериализации запрос выполнялся?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.