我有一个使用System.Data.OleDb
的简单的双层C#解决方案,它可以正常工作(除了对可能的SQL命令非常恼人的限制)。
现在我试图转移到System.Data.SQLite
,开始发生一些非常奇怪的事情。
我以前在上层有很多IEnuberable<T>.ToList()
方法,来自System.Linq
(完全独立于SQLite,在添加SQLite包之前就已存在)。
现在所有这些ToList()
方法都会给我以下错误,这对我没有任何意义,因为这些SQLiteDataReader
个实例中绝对没有IEnumerable<LotsOfTypes>
:< / p>
错误CS0012类型&#39; SQLiteDataReader&#39;在未引用的程序集中定义。您必须添加对程序集的引用,System.Data.SQLite,Version = 1.0.108.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139&#39;。
这里发生了什么?我该如何解决这个问题?难道不能简单地识别System.Linq
的方法吗?我真的不需要在上层引用SQLite程序集,因为它不访问数据库。
使用示例
string[] projectLines = ....;
List<ProjectOld> oldProjects;
IEnumerable<ProjectOld> old = projectLines.Select(line => new ProjectOld(line));
oldProjects = old.ToList(); //error here!!!
更新
我实际上有自己定义的扩展方法SQLiteDataReader.ToList()
,如果我更改此方法的名称,则错误消失:
public static class DBReaderExtensionsSQLite
{
/// <summary>
/// returns a list with the items of type T and closes the reader
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="reader"></param>
/// <returns></returns>
public static List<T> ToList<T>(this SQLiteDataReader reader) where T : IDataItem, new()
{
List<T> list = new List<T>();
if (!reader.HasRows)
return list;
while (reader.Read())
{
T item = new T();
item.Populate(reader);
list.Add(item);
}
reader.Close();
return list;
}
但是,这里仍然存在一些错误,因为我使用OleDbDataReader
这个方法并没有发生任何错误:
public static class DBReaderExtensions
{
/// <summary>
/// returns a list with the items of type T and closes the reader
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="reader"></param>
/// <returns></returns>
public static List<T> ToList<T>(this OleDbDataReader reader) where T : IDataItem, new()
{
List<T> list = new List<T>();
if (!reader.HasRows)
return list;
while (reader.Read())
{
T item = new T();
item.Populate(reader);
list.Add(item);
}
reader.Close();
return list;
}
为什么只有SQLiteDataReader
而不是OleDbDataReader
??