在LINQPad中使用数据上下文调用静态方法

时间:2014-03-11 19:21:07

标签: c# linq-to-sql linqpad

我正在使用LINQPad开发一种新的数据访问方法。在对MySchemaContext中的表执行LINQ-to-SQL查询的方法中,我使用的参数是使用静态方法从同一DataContext对象加载默认值。

当我在LINQPad中调用这个静态函数时(使用" C#Program"设置) - 一个在从应用程序调用时工作正常,并且是公共的 - 我得到一个空引用异常将静态函数的返回值赋给变量的行。如果我改变了函数的逻辑,如果我不引用MySchemaContext(例如,如果我手工组装List并返回它),它就会起作用,但是如果我引用了MySchemaContext,则抛出异常。

我的猜测是,这与LINQPad连接到我的数据库的方式有关 - 当从LINQPad调用库函数时,DataContext无效,并且{{1引发了空引用异常}} 在图书馆。这是LINQPad的限制,还是有一些显而易见的遗漏?

以下是我遇到问题的那种功能的示例。第一部分是我的库中的代码(我从LINQPad查询中调用):

GetTable<MyClassTable>

库函数在我的应用程序中运行良好。第二部分是在我的LINQPad查询中,试图调用同样的函数:

namespace MyLibrary
{
 public class MyClass : MyClassTable
 {
   //There are reasons not to just add stuff to the partial class MyClassTable 
   //that aren't shown in this generic example

  public int MyClassTemplateID {get; set;}
  public int MyInt {get; set;}
  public string MyString {get; set;}

  public MyClass() {}
  public MyClass(int myClassTemplateID, int myInt, string myString) 
  {
   MyClassTemplateID = myClassTemplateID;
   MyInt = myInt;
   MyString = myString;
  }
  public static List<MyClass> GetMyClassesTemplate(int myClassTemplateID)
  {
   //MySchemaContext is a LINQ-to-SQL DataContext object, i.e., inherits from System.Data.Linq.DataContext 
   using (MySchemaContext myContext = new MySchemaContext())
   {
    return (from mct in myContext.GetTable<MyClassTable>().AsQueryable() 
     where mct.MyClassTemplateID == myClassTemplateID 
     select new MyClass
     {
      MyClassTemplateID = mct.MyClassTemplateID,
      MyInt = mct.MyInt,
      MyString = mct.MyString
     }).ToList<MyClass>();
   }
  }
 }
}

1 个答案:

答案 0 :(得分:1)

我怀疑你的问题是使用单独的命名空间。我可以使用以下代码访问LINQPad中的静态方法。 Nptice特别是开括号和右括号的不匹配。

    void Main()
    {
        tName.test.DoIt(); // Fully qualify the static method name
    }

} // Close the generated context's class

namespace tName
{
    public class test
    {
    // Define other methods and classes here
        public static void DoIt()
        {
            Console.WriteLine("Done");
        }
    }
// } Don't close the namespace. Let LinqPad do it.

使用LinqPad,您实际上是将您键入的代码注入生成的上下文中。因此,在注入新的命名空间/类之前,您需要假设它已经关闭了上下文的类。如果您没有使用命名空间,您将能够创建一个新类,但该类将是托管类的子类,而不是直接在相关名称空间下。我在这个blog post中进一步讨论了这个问题。