给出一个班级
[Table ( Name = "AllPlayerInfo" ) ]
public class AllPlayerInfo
{
[Column (IsPrimaryKey = true)]
public decimal Classes_ID { get; set; }
[Column (IsPrimaryKey = true)]
public decimal Member_ID { get; set; }
//...
}
我打电话
DataContext db2 = new DataContext ( sqlconnectstring );
Table<AllPlayerInfo> api = db2.GetTable<AllPlayerInfo> ();
返回数据库表中的所有记录。
我查看了api
的内容,并确认我想要的记录在那里并且有Member_ID == 4617
。
所以我发出以下命令:
AllPlayerInfo attempt1 = api.Where ( r => r.Member_ID == 4617).FirstOrDefault<AllPlayerInfo> ();
(错误地)返回null
。
然后我将对象转移到列表中:
List<AllPlayerInfo> listapi = api.ToList<AllPlayerInfo> ();
然后使用Exists
方法找到我想要的记录:
bool recordexists = listapi.Exists ( r => r.Member_ID == 4617 );
recordexists
是true
!
所以问题是:为什么Where
方法显然没有找到记录?我确实尝试了Where
方法与其他字段和值,他们工作。只是没有这个特殊的领域。我测试了其他十进制字段,例如class_id
,但它确实有效。
答案 0 :(得分:0)
一个猜测(如Timwi的)是decimal
类型令人困惑的事情。试试这个:
AllPlayerInfo attempt1 = api.Where(r => r.Member_ID == 4617m)
.FirstOrDefault();
换句话说,也将常数设为小数。这可能会阻止LINQ to SQL在不应该的情况下应用转换。
此外,如有疑问,请检查生成的SQL。
答案 1 :(得分:0)
我会检查SQL profiler中生成的SQL。有时当LINQ to SQL确定您正在比较不正确的类型时,例如Where(x => x.somestring == null)
和x.somestring在DBML文件中没有设置为可空,然后它生成一个带有WHERE 1=0
的where子句的SQL,然后在SQL服务器中运行,它将很快返回没有记录。成员ID是一个小数,它可能会将你的文字作为一个int进行修改,因此它决定Where( r => r.Member_ID == 4617)
不能为真,因此它会创建永远不会返回任何记录的SQL。
答案 2 :(得分:0)
谢谢Ben。你让我想到了......
我决定将Column属性更改为“[Column ( IsPrimaryKey = true, CanBeNull = false, DbType = "decimal" )]
”,并且代码突然有效。
然后我尝试删除“DbType =”部分,并再次WHERE方法不起作用。显然,如果你没有在属性中指定数据类型,那么它有时会不匹配而不提供任何线索它不起作用。
所以我想我最好总是包含DbType属性,即使变量已经与数据库同时也是如此。