Как сделать тип возврата для набора результатов в LINQ - PullRequest
2 голосов
/ 04 марта 2009

У меня проблема с определением того, как c # и LINQ решают общую проблему обработки структуры данных, которая не обязательно возвращает структуру таблицы, а вместо этого - набор результатов.

У меня есть хранимая процедура, которая работает, и я включил ее в мой DBML

[Function(Name="dbo.p_GetObject")]
public int p_GetObject([Parameter(Name="ObjectType", DbType="NVarChar(200)")] string objectType, [Parameter(Name="ItemState", DbType="Bit")] System.Nullable<bool> itemState, [Parameter(Name="IsPublished", DbType="Bit")] System.Nullable<bool> isPublished)
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), objectType, itemState, isPublished);
    return ((int)(result.ReturnValue));
}

В dbml говорится, что тип возвращаемого значения (Нет), и это может быть ключевой проблемой. Однако у меня нет объекта DBML, который соответствует результирующему набору.

SP принимает три параметра и возвращает результирующий набор с тремя столбцами (ID, Имя, Значение) с несколькими строками. Я могу создать для этого объект данных и назвать его resultSet

Когда я пишу вызов функции для этого, я застреваю:

public List<resultset> GetObject(string objectType, bool itemState, bool isPublished)
{
    MyDataContext.p_GetObject(objectType, itemState, isPublished);
}

Мои вопросы:

как мне вызвать контекстный вызов данных для хранимой процедуры, чтобы заполнить мой объект resultSet? Есть ли лучший подход? Каким должен быть тип возвращаемого значения? Представление SQL? Ищете хорошие предложения ...

1 Ответ

6 голосов
/ 04 марта 2009

Если он просто не понимает ваш SP, это может быть проблемой SET FMT_ONLY ... попробуйте сгенерировать данные из упрощенной версии SP?

Обычно SP / UDF, которые не отображают 1: 1 с существующей сущностью, выставляют себя в сгенерированном типе. Вы можете переименовать это в файле DBML (не в дизайнере), но лично я бы не стал; Я стараюсь пометить SP как частный и написать свой собственный метод, который проецируется на мой собственный тип POCO (определенный для репозитория):

var typed = from row in cxt.SomeFunction(123)
            select new MyType {Id = row.Id, Name = row.Name, ...}

Причина этого частично в чистоте хранилища, а частично в том, чтобы не допустить привычки дизайнера переписывать DBML неожиданными способами ;-p Подробнее см. здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...