StoredProcedure Возвращение нескольких результатов SQL для LINQ с использованием дизайнера
-
29-09-2019 - |
Вопрос
Я хочу получить несколько результатов от STOREDPROC с помощью SQL TO LINQ. Я не смог генерировать его от Designer, поэтому я написал ниже код в файле Designer.cs. Но всякий раз, когда я добавляю что -то в дизайнер, он обновляет дизайнер с разметом в файле .dbml, и, следовательно, он удаляет приведенный ниже код каждый раз, когда я что -то добавляю. Я должен копировать его каждый раз. Если я смогу получить соответствующую разметку DBML для этого, это было бы здорово.
[Function(Name = "dbo.GetAllModulesAndOptions")]
[ResultType(typeof(Module))]
[ResultType(typeof(ModuleOption))]
public IMultipleResults GetAllModules()
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
return ((IMultipleResults)(result.ReturnValue));
}
Я уже определил модуль и модулеопион как таблицы. Теперь, когда я добавляю ниже разметки в файл .dbml, он жалуетсяDBML1114: The Name attribute 'Module' of the Type element is already used by another type.
<Function Name="dbo.GetAllModulesAndOptions" Method="GetAllModules">
<ElementType Name="Module">
<Column Name="ModuleId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
<Column Name="ModuleName" Type="System.String" DbType="VarChar(50)" CanBeNull="true" />
<Column Name="Description" Type="System.String" DbType="VarChar(255)" CanBeNull="true" />
<Column Name="SalesDesc" Type="System.String" DbType="VarChar(MAX)" CanBeNull="true" />
<Column Name="ParentModuleId" Type="System.Int32" DbType="Int" CanBeNull="true" />
</ElementType>
<ElementType Name="ModuleOption">
<Column Name="ModuleOptionId" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
<Column Name="ModuleOptionName" Type="System.String" DbType="VarChar(50)" CanBeNull="true" />
<Column Name="ModuleOptionDesc" Type="System.String" DbType="VarChar(MAX)" CanBeNull="true" />
<Column Name="DefaultPrice" Type="System.Decimal" DbType="Money" CanBeNull="true" />
<Column Name="ModuleId" Type="System.Int64" DbType="BigInt" CanBeNull="true" />
<Column Name="InUse" Type="System.Int32" DbType="Int" CanBeNull="true" />
</ElementType>
</Function>
Я использую Visual Studio 2008 SP1
Решение 2
Я отвечаю на мой собственный ответ.
Нельзя использовать уже определенный тип для набора результатов хранимой процедуры. Поэтому мне пришлось изменить имя elementtype на модулеруса и модулеопюрулт.
<Function Name="dbo.GetAllModulesAndOptions" Method="GetAllModules">
<ElementType Name="ModuleResult">
<Column Name="ModuleId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
<Column Name="ModuleName" Type="System.String" DbType="VarChar(50)" CanBeNull="true" />
<Column Name="Description" Type="System.String" DbType="VarChar(255)" CanBeNull="true" />
<Column Name="SalesDesc" Type="System.String" DbType="VarChar(MAX)" CanBeNull="true" />
<Column Name="ParentModuleId" Type="System.Int32" DbType="Int" CanBeNull="true" />
</ElementType>
<ElementType Name="ModuleOptionResult">
<Column Name="ModuleOptionId" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
<Column Name="ModuleOptionName" Type="System.String" DbType="VarChar(50)" CanBeNull="true" />
<Column Name="ModuleOptionDesc" Type="System.String" DbType="VarChar(MAX)" CanBeNull="true" />
<Column Name="DefaultPrice" Type="System.Decimal" DbType="Money" CanBeNull="true" />
<Column Name="ModuleId" Type="System.Int64" DbType="BigInt" CanBeNull="true" />
<Column Name="InUse" Type="System.Int32" DbType="Int" CanBeNull="true" />
</ElementType>
</Function>
Вот шаги, которые я взял, чтобы решить вышеуказанную проблему.
- Удалить файл .designer.cs
- Добавить выше разметки в файл .dbml
- Exculide .dbml и .dbml.layout file
- Включите файл .dbml и .dbml.layout (еще раз будет генерировать файл .designer.cs, но не будет включать его в проект).
- Включите .Designer File в проект.
- Получите список типа модуля и типа ModuleOption, как ниже.
var modules = from row in results.GetResult<ModuleResult>().ToList()
select new Module
{
ModuleId = row.ModuleId,
ModuleName = row.ModuleName,
Description = row.Description,
SalesDesc = row.SalesDesc,
ParentModuleId = row.ParentModuleId
};
var moduleOptions = from row in results.GetResult<ModuleOptionResult>().ToList()
select new ModuleOption
{
ModuleOptionId = row.ModuleOptionId,
ModuleOptionName = row.ModuleOptionName,
ModuleOptionDesc = row.ModuleOptionDesc,
DefaultPrice = row.DefaultPrice,
ModuleId = row.ModuleId,
InUse = row.InUse
};
ОБНОВИТЬ
Все еще лучший способ.Щелкните правой кнопкой мыши файл DBML в исследовании решений и выберите «Открыть». Выбирать XML Editor
И когда вы сохраняете файл в Visual Studio, он автоматически генерирует файл designer.cs.
Другие советы
Добавьте метод в частичный класс для контекста данных.
Вы достигаете этого, добавив файл с тем же именем, что и контекст данных рядом с файлом DBML, и используйте декларацию класса:
public partial class YourDataContext
{
[Function(Name = "dbo.GetAllModulesAndOptions")]
[ResultType(typeof(Module))]
[ResultType(typeof(ModuleOption))]
public IMultipleResults GetAllModules()
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo (MethodInfo.GetCurrentMethod())));
return ((IMultipleResults)(result.ReturnValue));
}
}