gpt4 book ai didi

c# - 指定的强制类型转换无效的 Linq 查询

转载 作者:太空狗 更新时间:2023-10-29 21:04:49 24 4
gpt4 key购买 nike

您好,我想根据主键查询一个表。

我都试过了

var deviceDetails = (from d in db.Devices
where d.DeviceId == pointDetails.DeviceId
select d).ToList();

编辑 d.DeviceId

var deviceDetails = db.Devices.Single(d => d.DeviceId == pointDetails.DeviceId)

我知道这些返回不同的类型,但这不是现在的问题。

此语句抛出一个 invalidCastException,我不知道为什么。 PointDetails.DeviceId 绝对是一个有效的 int。即使我用硬编码的 int 替换它,也会抛出异常。

这里是堆栈跟踪的相关部分。

 at System.Data.SqlClient.SqlBuffer.get_Int32()
at System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i)
at Read_Device(ObjectMaterializer`1 )
at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)

感谢任何帮助,因为我没有想法。

类定义和架构这是 Device 的类定义

[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Devices")]
public partial class Device : INotifyPropertyChanging, INotifyPropertyChanged
{

private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);

private int _DeviceId;
private int _DeviceTypeId;
private string _DeviceName;
private string _DeviceMACAddress;
private string _DeviceIPAddress;
private string _DeviceSubnetMask;
private string _DeviceGatewayAddress;
private int _ZoneId;
private int _TelevisionTypeId;
private int _DeviceStatusId;
private byte _DeviceIsModified;
private int _DeviceSetupBaudRate;
private int _DeviceConfigId;
private byte _DeviceSetupIsInputInternalPower;
private int _DeviceBedSensorInput;
private int _DeviceEnsuiteSensorInput;
private int _DeviceRoomSensorInput;
private string _DeviceSetupString1;
private string _DeviceSetupString2;
private string _DeviceSetupString3;
private string _DeviceSetupString4;
private byte _DeviceSetupIsWiegand;
private int _DeviceSetupOptionId;
private byte _DeviceSetupIsLightMomentary;
private string _DeviceTestDateTime;
private string _DeviceTestResults;

SQL 设计

SQL Design Schema

编辑确定导致问题的列

我一次选择了一个列来查找导致转换异常的列,它是 DeviceStatusId。SQL 中 tinyInt 类型的约束是什么?正确进行此转换的任何建议

最佳答案

我认为错误不一定在您的 where 谓词中,而是在您的 select 中(至少是间接的)。数据库中的列(不一定是 DeviceId 列)很可能与已编译的 C# 代码中的属性属于不同类型。它可以像一个可以为 null 的列(并且在某处包含一个 null 值)一样简单,其中代码的属性不可为 null。

注意异常发生的地方。此行表明它是在枚举结果时,而不是在评估 where 子句时(调用“ToList”):

System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)

这行表明它是在构建实例时(或者更确切地说,是在“物化”“对象”时):

Read_Device(ObjectMaterializer`1 )

和这个一样(对构造函数的调用):

System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)

基本上,至少有一个列与代码不匹配,并且至少有一个记录利用了这一差异。发生这种情况时,正在构建的对象的构造函数会抛出异常,因为它无法理解接收到的数据。

关于c# - 指定的强制类型转换无效的 Linq 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22159695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com