storedprocedure إرجاع sql results sql إلى LINQ باستخدام المصمم
-
29-09-2019 - |
سؤال
أريد الحصول على نتائج متعددة من مخزنة باستخدام SQL إلى 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 إلى Moduleresult و ModuleOptionResult.
<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
- استبعاد ملف .dbml و .dbml.layout
- قم بتضمين ملف .dbml و .dbml.layout (سيؤدي ذلك إلى إنشاء ملف .designer.cs مرة أخرى ولكن لن يتم تضمينه في المشروع).
- تشمل ملف .designer في المشروع.
- احصل على قائمة نوع الوحدة ونوع الوحدة النمطية على النحو التالي.
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 في Solution Explorer وحدد فتح مع. يختار 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));
}
}