当方法明显存在时,方法找不到对象

时间:2010-08-12 14:38:32

标签: c# linq-to-sql

给出一个班级

[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 );

recordexiststrue

所以问题是:为什么Where方法显然没有找到记录?我确实尝试了Where方法与其他字段和值,他们工作。只是没有这个特殊的领域。我测试了其他十进制字段,例如class_id,但它确实有效。

3 个答案:

答案 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属性,即使变量已经与数据库同时也是如此。