Как я могу перебрать C # IEnumerable в Matlab? - PullRequest
5 голосов
/ 17 июня 2011

У меня есть некоторый код Linq to SQL в C #, к которому я пытаюсь получить доступ с помощью Matlab 2010b.Если мой код Linq возвращает один экземпляр элемента, я могу без проблем получить доступ ко всем свойствам в Matlab:

dal = Data.PeopleRepository
person = dal.QueryPersonById(1)
person.Name

ans = 

John Smith

Но если я вызову запрос Linq, который возвращает коллекцию IQueryable (на самом деле System.Data.LinqКласс .Table), я изо всех сил пытаюсь добраться до списка экземпляров Person внутри!

people = dal.QueryAllPeople()

people = 

System.Data.Linq.Table<Data.Person> handle
Package: System.Data.Linq
Properties:
   Context: [1x1 Data.PeopleRepository]
   IsReadOnly: 0

Я пытался преобразовать в IEnumerable, используя метод GetEnumerator для людей, но я все еще не могу получитьв реальных экземплярах лица внутри.(Я знаю, что из-за поздней оценки значения еще не могут быть фактически извлечены из базы данных тоже! Аааааа!) Любые указатели оценены, и извинения, если это неясно - это мой первый вопрос StackOverflow ...

Ответы [ 2 ]

8 голосов
/ 20 июня 2011

Сегодня была такая же проблема. Действительно возможно вызвать методы расширения. Однако синтаксис немного неуклюжий.

Для перечисления удобен метод расширения IEnumerable.ToArray (). Для методов расширения вам необходимо знать, где они определены. В этом случае полная подпись метода System.Linq.Enumerable.ToArray<T>(this IEnumerable<T>). Matlab не заботится о модификаторе this. Однако, поскольку это универсальный метод, вы не можете напрямую использовать его в Matlab. Вместо этого необходим метод NET.invokeGeneric.

В следующем примере перечисляются значения типа double и преобразовывается результат в массив Matlab.

ret = double(NET.invokeGenericMethod('System.Linq.Enumerable', 'ToArray', ...
   {'System.Double'}, enumerableInstance));

Начиная с IQueryable<T> : IEnumerable<T>, тот же метод (ToArray()) должен выполнять вашу работу. Не используйте преобразование в двойной массив Matlab и укажите правильный тип элемента (Data.Person, я полагаю).

Чтобы получить доступ к статическому классу Enumerable, Matlab должен загрузить библиотеку .NET 3.0. Добавить

NET.addAssembly('System.Core');

для этой цели.

2 голосов
/ 18 июня 2011

Я работал только с Matlab и C # (вызывая Matlab из C #), но мне кажется, что проблема в том, что у вас есть экземпляр IQueryable вместо IEnumerable в вашем коде.

Попробуйте позвонить people = dal.QueryAllPeople().ToList() или people = dal.QueryAllPeople.ToArray() - это приведет к выполнению запроса - и мы надеемся, что данные будут доступны внутри Matlab.


Обновление - поскольку методы расширения запрещены ... что произойдет, если вы попытаетесь:

myEnumerator = dal.QueryAllPeople().GetEnumerator()
myEnumerator.MoveNext()
firstItem = myEnumerator.Current
firstItem =

myEnumerator.MoveNext()
secondItem = myEnumerator.Current
secondItem =
...