Понимание результатов нескольких таблиц в Entity Framework - PullRequest
4 голосов
/ 22 декабря 2010

Чтобы показать страницу, мне нужно собрать много информации из разных таблиц, и сейчас загрузка страницы занимает около 20 секунд, ведь это ужасно.

Так что я хочу переместить всев одну процедуру хранения и получить всю эту информацию старым способом DataTable.

Я получаю эту

public WinnerPageInformation FindWinnerPageInformation(int calendarId)
{
    BackendPagesContext ctx = new BackendPagesContext(db.Connection);
    IMultipleResults results = ctx.WinnersBackendPageInformation(calendarId);

    return new WinnerPageInformation()
    {
        Challenges = results.GetResult<Challenges>(),
        Content = results.GetResult<ContentWinners>().FirstOrDefault(),
        Einfo = results.GetResult<ContentEmails>().FirstOrDefault(),
        Fields = results.GetResult<SubscriberFields>(),
        Prizes = results.GetResult<Prizes>(),
        Winners = results.GetResult<Winners>()
    };
}

и WinnersBackendPageInformation выглядит следующим образом

public class BackendPagesContext : DataContext
{
    public BackendPagesContext(System.Data.IDbConnection connection) 
        : base(connection) { }

    [Function(Name = "dbo.sp_GetWinnersBackendPageInformation")]
    [ResultType(typeof(JK_ContentWinners))]
    [ResultType(typeof(JK_Winners))]
    [ResultType(typeof(JK_SubscriberFields))]
    [ResultType(typeof(JK_Prizes))]
    [ResultType(typeof(JK_Challenges))]
    [ResultType(typeof(JK_ContentEmails))]
    public IMultipleResults WinnersBackendPageInformation(
        [Parameter(Name = "calendarId", DbType = "Int")] int calendarId)
    {
        IExecuteResult result =
        this.ExecuteMethodCall(this,
                               ((MethodInfo)(MethodInfo.GetCurrentMethod())),
                               calendarId);
        return (IMultipleResults)(result.ReturnValue);
    }
}

public interface IMultipleResults : IFunctionResult, IDisposable
{
    IEnumerable<TElement> GetResult<TElement>();
}

, но проблема, которую ясталкиваюсь с тем, что строка this.ExecuteMethodCall выдает ошибку о том, что результат не является результатом MultipleTable.

моя процедура хранения выглядит как

ALTER PROCEDURE sp_GetWinnersBackendPageInformation
    @calendarId numeric = 0
AS
BEGIN 
    SELECT * FROM ContentWinners WHERE calendar_id = @calendarId;
    SELECT * FROM Winners WHERE calendar_id = @calendarId;
    SELECT * FROM SubscriberFields WHERE calendar_id = @calendarId ORDER BY position;
    SELECT * FROM Prizes WHERE calendar_id = @calendarId ORDER BY prizetype_id, to_day, title;
    SELECT * FROM Challenges WHERE calendar_id = @calendarId;
    SELECT * FROM ContentEmails WHERE calendar_id = @calendarId;
END
GO

Сообщение об ошибке

Для функции 'WinnersBackendPageInformation' объявлено более одного типа результата, который не возвращает IMultipleResults.

Чего мне не хватает?

1 Ответ

2 голосов
/ 22 декабря 2010

Вы ничего не упускаете.

Entity Framework 4 не поддерживает множественные наборы результатов в хранимых процедурах.

Если вы читаете сообщение в блоге здесь , выВы найдете это утверждение от члена команды EF:

К сожалению, в этот раз мы не смогли получить полную поддержку для нескольких результатов в продукте.Однако мы добавили метод Translate<T> в ObjectContext, который позволяет материализовать объекты из DataReader.Таким образом, если у вас есть хранимая процедура, которая возвращает несколько результатов, свойства которых напрямую выровнены с объектами EF, то вы можете получить основное хранилище из контекста (context.Connection.StoreConnection), создать команду и использовать ее для выполнения хранимой процедуры ивернуть DataReader.Затем вы могли бы позвонить Translate<FirstObjectType> и вернуть множество перечисленных объектов, за которыми следовали бы reader.NextResult(), Translate<SecondObjectType> и т. Д.

Итак, вы можете использовать некоторую ADO "старой школы".NET, в качестве альтернативы вы можете попробовать проект EF Extensions на CodePlex , который, кажется, сделает за вас сантехнику.

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