LINQ to SQL: результаты хранимых процедур

Как я могу изменить имя класса результата хранимой процедуры, сгенерированного дизайнером LINQ to SQL (помимо использования Designer.cs)?

Кроме того, как можно выполнить запрос linq к набору результатов хранимой процедуры?

Ответов (2)

Решение

Вы можете отредактировать это в dbml? Лично я склонен рассматривать автоматически сгенерированные типы (из функций и хранимых процедур) как DTO, которые являются локальными для DAL, поэтому я немедленно переназначаю их на свое собственное представление POCO, т.е.

var qry = from row in ctx.SomeProc(12345)
          select new Foo {ID = row.ID, Name = row.Name };

и т.д. Повторите второй вопрос: «Кроме того, как можно выполнить запрос linq к набору результатов хранимой процедуры?» - Я бы рекомендовал использовать UDF вместо хранимой процедуры, если вы хотите ее составить: это позволяет вам выполнять композицию в базе данных, например разбиение на страницы и фильтрацию:

var qry = (from row in ctx.SomeFunction(12345)
          where row.IsActive
          select row).Skip(10).Take(10);

который должен (по крайней мере, в LINQ-to-SQL) делать все в TSQL на сервере. В противном случае вы можете вызвать AsEnumerable() и использовать LINQ-to-Objects на вызывающем уровне .NET:

var qry = (from row in ctx.SomeProc(12345).AsEnumerable()
          where row.IsActive
          select row).Skip(10).Take(10);

Чтобы отредактировать dbml (это просто xml), измените ElementType/@Name здесь:

<Function Name="dbo.CustOrderHist" Method="CustOrderHist">
  <Parameter Name="CustomerID" Parameter="customerID" Type="System.String" DbType="NChar(5)" />
  <ElementType Name="FooBar"> <!-- ********** HERE ************ -->
      <Column Name="ProductName" Type="System.String" DbType="NVarChar(40) NOT NULL" CanBeNull="false" />
      <Column Name="Total" Type="System.Int32" DbType="Int" CanBeNull="true" />
  </ElementType>
</Function>

Кроме того, как можно выполнить запрос linq к набору результатов хранимой процедуры?

var query = from results in datacontext.storedprocedurename()
            where results.whatever == 1
            select results;