我正在使用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>();
}
}
}
}
答案 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中进一步讨论了这个问题。