以下信息公开了 LINQ to SQL 应用程序中可能会遇到的一些问题,并提供建议来避免或减少这些问题的影响。
常见问题解答中解决了其他 问题。
不支持的标准查询运算符
LINQ to SQL 不支持所有标准查询运算符方法(例如 ElementAt)。 因此,编译的项目仍会产生运行时错误。 有关详细信息,请参阅 标准查询运算符翻译。
内存问题
如果查询涉及内存中集合和 LINQ to SQL Table<TEntity>,则查询可能在内存中执行,具体取决于指定两个集合的顺序。 如果查询必须在内存中执行,则需要检索数据库表中的数据。
此方法效率低下,可能会导致大量内存和处理器使用率。 尝试避免此类多域查询。
文件名和 SQLMetal
若要指定输入文件名,请将名称作为输入文件添加到命令行。 不支持在连接字符串中包含文件名(使用 /conn 选项)。 有关详细信息,请参阅 SqlMetal.exe(代码生成工具)。
类库项目
对象关系设计器在 app.config 项目的文件中创建连接字符串。 在类库项目中,不会用到app.config文件。 LINQ to SQL 使用设计时文件中提供的连接字符串。 更改值 app.config 不会更改应用程序连接到的数据库。
级联删除
LINQ to SQL 不支持或识别级联删除作。 如果要删除具有约束的表中的一行,必须执行以下之一:
在
ON DELETE CASCADE数据库中的外键约束中设置规则。使用自己的代码首先删除阻止删除父对象的子对象。
否则,将引发 SqlException 异常。
有关详细信息,请参阅 “如何:从数据库中删除行”。
表达式不可查询
如果收到“表达式 [表达式] 不可查询;是否缺少程序集引用?”错误,请确认以下几点:
应用程序面向 .NET Compact Framework 3.5。
你有引用
System.Core.dll和System.Data.Linq.dll。你有一个
Imports(Visual Basic) 或using(C#) 指令,用于 System.Linq 和 System.Data.Linq.
DuplicateKeyException
在调试 LINQ to SQL 项目的过程中,可以遍历实体的关系。 这样做会将这些项引入缓存中,LINQ to SQL 会意识到其存在。 如果随后尝试执行 Attach 或 InsertOnSubmit 或生成多个具有相同键的行的类似方法,则会抛出DuplicateKeyException 。
字符串串联异常
不支持对映射到 [n]text 和其他 [n][var]char 的操作数进行串联。 为将字符串映射到两组不同类型后进行串联而引发异常。 有关详细信息,请参阅 System.String 方法。
在 SQL Server 2000 中跳过和处理异常
使用Take或Skip针对 SQL Server 2000 数据库时,必须使用标识成员(IsPrimaryKey)。 查询必须针对单个表(即不是联接),或者是 Distinct、Except、Intersect 或 Union 操作,并且不能包含 Concat 操作。 有关详细信息,请参阅 标准查询操作员翻译中的“SQL Server 2000 支持”部分。
此要求不适用于 SQL Server 2005。
GroupBy InvalidOperationException
当在按boolean表达式分组(如group x by (Phone==@phone))的GroupBy查询中,列值为 null 时,将引发此异常。 因为表达式是一个 boolean,因此,该键被推断为 boolean,而不是 nullableboolean。 当转换后的比较生成 null 时,将尝试向 a nullable赋值booleanboolean,并引发异常。
若要避免这种情况(假设要将 null 视为 false),请使用如下方法:
GroupBy="(Phone != null) && (Phone=@Phone)"
OnCreated() 分部方法
每次调用对象构造函数时,都会调用生成的方法 OnCreated(),包括 LINQ to SQL 调用构造函数来复制原始值的情况。 在自己的分部类中实现OnCreated()方法时,请考虑到此行为。