سؤال

أريد الحصول على نتائج متعددة من مخزنة باستخدام 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>

فيما يلي الخطوات التي اتخذتها لحل المشكلة أعلاه.

  1. حذف ملف .designer.cs
  2. أضف العلامات المذكورة أعلاه إلى ملف .dbml
  3. استبعاد ملف .dbml و .dbml.layout
  4. قم بتضمين ملف .dbml و .dbml.layout (سيؤدي ذلك إلى إنشاء ملف .designer.cs مرة أخرى ولكن لن يتم تضمينه في المشروع).
  5. تشمل ملف .designer في المشروع.
  6. احصل على قائمة نوع الوحدة ونوع الوحدة النمطية على النحو التالي.


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));
    }   
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top