Проблема с хранимой процедурой Linq - возврат int

Я пытаюсь вызвать хранимую процедуру с помощью Linq, хранимая процедура возвращает значение в SQL, но когда я перетаскиваю ее в свой файл DBML и пытаюсь вызвать ее из своего кода, она возвращает

Не удалось найти реализацию шаблона запроса для типа источника int. "Выбрать" не найдено.

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

Это код DBML, лежащий в основе

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.displayDetails")]
public int displayDetails([global::System.Data.Linq.Mapping.ParameterAttribute(DbType="VarChar(1)")] string sex, [global::System.Data.Linq.Mapping.ParameterAttribute(DbType="Int")] System.Nullable<int> day, [global::System.Data.Linq.Mapping.ParameterAttribute(DbType="Int")] System.Nullable<int> month, [global::System.Data.Linq.Mapping.ParameterAttribute(DbType="Int")] System.Nullable<int> year, [global::System.Data.Linq.Mapping.ParameterAttribute(Name="PostCode", DbType="VarChar(10)")] string postCode, [global::System.Data.Linq.Mapping.ParameterAttribute(Name="AppTime", DbType="DateTime")] System.Nullable<System.DateTime> appTime, [global::System.Data.Linq.Mapping.ParameterAttribute(DbType="Int")] System.Nullable<int> filter)
{
        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), sex, day, month, year, postCode, appTime, filter);
        return ((int)(result.ReturnValue));
}

Код моей страницы, на которой возникает ошибка

    var person = from p in db.displayDetails(sex.ToString(),
                  Convert.ToInt32(dayOfBirth),
                  Convert.ToInt32(monthOfBirth),
                  Convert.ToInt32(yearOfBirth),
                  postCode.ToString(),
                  Convert.ToDateTime(appointmentTime),
                  Convert.ToInt32(resultType))
                  select person;
        {
            p.Forename,
            p.Surname,
            p.AppointmentTime,
            p.Location
        };

        foreach (var record in person)
        {
            lblName.Text = record.Forename + " " + record.Surname;
            lblAppointmentTime.Text = record.AppointmentTime.ToString();
            lblWaitIn.Text = record.Location;
        }   

Любая помощь о том, как решить эту проблему, будет оценена.

Обновление - Привет, вот мой SP:

@sex varchar (1),
@day int,
@month int,
@year int,
@PostCode varchar (10),
@AppTime DateTime,
@filter int

AS
BEGIN

declare @sql nvarchar(max)
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here

Select @Sql = 'SELECT DAY(DateOfBirth) AS DayOfBirth, MONTH(DateOfBirth) AS MonthOfBirth, 
YEAR(DateOfBirth) AS YearOfBirth, DateOfBirth, Sex, AppointmentTime, SchdlRefno, Forename, 
Surname, ClinicCode, Ur, PostCode, Specialty, Location
FROM dbo.tbl_Appointments'


if @filter  = 1
-- show search by just sex, day and month as no more needed for match
Select @sql = @Sql + ' WHERE (DAY(DateOfBirth) = ' + convert(varchar, @day, 103) + ') AND (MONTH(DateOfBirth) = ' + convert(varchar, @month, 103) + ') AND (Sex = ''' + @sex + ''')' 

if @filter  = 2

-- show search by sex, day and month and postcode

Select @sql = @Sql + ' WHERE (DAY(DateOfBirth) = ' + convert(varchar, @day, 103) + ') AND (MONTH(DateOfBirth) = ' + convert(varchar, @month, 103) + ') and (YEAR(DateOfBirth) = ' + convert(varchar, @year, 103) + ') AND (Sex = ''' + @sex + ''') and (postcode = ''' + @postcode + ''')' 

if @filter  = 3

-- show search by sex, day and month, postcode and appointment time

Select @sql = @Sql + ' WHERE (DAY(DateOfBirth) = ' + convert(varchar, @day, 103) + ') AND (MONTH(DateOfBirth) = ' + convert(varchar, @month, 103) + ') and (YEAR(DateOfBirth) = ' + convert(varchar, @year, 103) + ') AND (Sex = ''' + @sex + ''') and (postcode = ''' + @postcode + ''') and (AppointmentTime = ''' + convert(varchar, @AppTime, 121) + ''')' 

print @sql  

Exec sp_executesql  @sql

END

Итак, я пропускаю фильтр, чтобы вернуть разные результаты поиска.

Спасибо


person Adamsk1    schedule 03.12.2012    source источник


Ответы (1)


Проблема в том, что результат вашей функции не является коллекцией, это скалярное значение (int), поэтому его нельзя спроецировать.

person James    schedule 03.12.2012
comment
Спасибо за быстрый ответ. Но как мне изменить это, если я не сталкивался с этим раньше? - person Adamsk1; 03.12.2012
comment
@ Adamsk1 вам необходимо обновить SP, чтобы он возвращал фактические результаты запроса вместо целочисленного значения. Не могли бы вы опубликовать детали реализации вашего SP? - person James; 03.12.2012
comment
@ Adamsk1 Я хотел бы обновить ваш вопрос, чтобы показать реализацию вашего SP. - person James; 03.12.2012
comment
Похоже, вы используете динамический SQL - убедитесь, что вы знаете о SQL Injection. Ваш запрос выглядит нормально (предположим, что он возвращает значения в конструкторе?). Я думаю, что с динамическим SQL генератор L2S изо всех сил пытается найти тип возвращаемого значения, чтобы вы могли попробовать сбросить результаты своего запроса во временную таблицу и заставить ваш SP выполнить SELECT из этого после выполнения SQL. - person James; 03.12.2012
comment
Все возвращается в норму, когда я вхожу в студию управления SQL, и sql, который он распечатывает, подходит. Я рассмотрю вариант временной таблицы, если вы не порекомендуете какой-либо другой способ сделать то, что я пытаюсь сделать? Спасибо - person Adamsk1; 03.12.2012
comment
Я думаю, что временная таблица и повторное создание вашей хранимой процедуры в DBML должны работать. Единственный другой способ, о котором я могу думать, - это изменить DBML XML, чтобы принудительно использовать возвращаемый тип ... Я считаю, что способ временной таблицы более надежен. - person James; 03.12.2012
comment
Это помогло с маршрутом временной таблицы. В очередной раз благодарим за помощь! :-) - person Adamsk1; 03.12.2012
comment
@ Adamsk1 не волнуйся, рад, что помог :) - person James; 03.12.2012