захватить выходной параметр из хранимой процедуры в LINQ To SQL ExecuteQuery - PullRequest
3 голосов
/ 18 августа 2010

Можно ли получить выходной параметр из LINQ To SQL DataContext при выполнении хранимой процедуры?

IEnumerable<Address> result = 
    ExecuteQuery<Address>(((MethodInfo)(MethodInfo.GetCurrentMethod())), 
       address, pageIndex, pageSize, totalCount);

, где address, pageIndex и pageSize - входные параметры, а TotalCount - выходной параметр.

Как вы можете захватить выходной параметр?

Вот еще одна попытка сделать это, но опять не может получить значение параметра:


    [Function(Name = "Telecom.AddressSearch")]
        private IEnumerable SearchAddress([Parameter(Name = "address", DbType = "varchar")] string address,
                                             [Parameter(Name = "pageIndex", DbType = "int")] int pageIndex,
                                             [Parameter(Name = "pageSize", DbType = "int")] int pageSize,
                                             [Parameter(Name = "totalCount", DbType = "int")] ref int totalCount)
        {            
            IEnumerable result = ExecuteQuery(((MethodInfo)(MethodInfo.GetCurrentMethod())), address, pageIndex, pageSize, totalCount);

            return result;
        }

1 Ответ

6 голосов
/ 18 августа 2010

Скотт Гатри имеет сообщение в блоге , в котором описывается, как заставить LINQ to SQL работать с хранимыми процедурами. Хотя его сообщение не дает прямого ответа на ваш вопрос, оно дает ключ к тому, что может сработать. При определении метода в классе .dbml «LINQ to SQL отображает параметры out в SPROC в качестве ссылочных параметров (ключевое слово ref)». Вы можете попробовать использовать ключевое слово ref и посмотреть, обновляется ли totalCount.

   IEnumerable r = ExecuteQuery(((MethodInfo)(MethodInfo.GetCurrentMethod())),
   address, pageIndex, pageSize, ref totalCount);

Обновление:

Я провел еще несколько исследований и нашел способ, который должен работать для вас. Это из статьи MSDN . Вам нужно будет расширить свой DataContext, но это не должно быть слишком большой проблемой (кажется, вы уже делаете это). Проверьте статью для получения дополнительной информации, но основная часть такова:

[Function(Name="dbo.CustOrderTotal")]
[return: Parameter(DbType="Int")]
public int CustOrderTotal([Parameter(Name="CustomerID", DbType="NChar(5)")] string customerID, [Parameter(Name="TotalSales", DbType="Money")] ref System.Nullable<decimal> totalSales)
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), customerID, totalSales);
    totalSales = ((System.Nullable<decimal>)(result.GetParameterValue(1)));
    return ((int)(result.ReturnValue));
}

Где 'this' - ваш DataContext.

Обновление 2:

IExecuteResult имеет свойство ReturnValue . Он имеет тип Object, поэтому вам нужно будет привести его к типу, чтобы получить результаты, но он должен позволить вам получить Enumerable результатов. В вашем случае что-то вроде этого должно работать:

IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), address, pageIndex, pageSize, totalCount);
totalCount = ((System.Nullable<decimal>)(result.GetParameterValue(3)));
return (IEnumerable<Address>)result.ReturnValue;
...