【问题标题】:Unable to cast object of type 'System.Data.Entity.Infrastructure.DbQuery`无法转换类型为“System.Data.Entity.Infrastructure.DbQuery”的对象
【发布时间】:2019-01-25 11:41:43
【问题描述】:

当我尝试按字段名称 uuid 查找记录时,出现以下错误:

{"无法将类型为 'System.Data.Entity.Infrastructure.DbQuery`1[SyncBank.Models.XeroBankAccount]' 的对象转换为类型 'SyncBank.Models.XeroBankAccount'

public XeroBankAccount FindAccountByUuid(String uuid)
        {
            try
            {
                using (SyncBankDbContext dbContext = new SyncBankDbContext())
                {
                    string tempUuid = uuid;
                    var result = (XeroBankAccount) dbContext.XeroBankAccounts.Where(x => x.AccountUuid == tempUuid);
                    return result;
                }
            }
            catch (Exception e)
            {
                string errorMessage = e.Message;
                return null;
            }
        }

错误:

{"Unable to cast object of type 'System.Data.Entity.Infrastructure.DbQuery`1[SyncBank.Models.XeroBankAccount]' to type 'SyncBank.Models.XeroBankAccount'."}

XeroBankAccount.cs:

using System;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using SyncBank.Xero;

namespace SyncBank.Models
{
    [Serializable]
    [Table("xero_bank_account")]
    public class XeroBankAccount
    {

        [Key]
        [Column("id")]
        public int Id { get; set; }

        [ForeignKey("XeroOrganisation")]
        [Column("organisation_id")]
        public int XeroOrganisationId { get; set; }

        public XeroOrganisation XeroOrganisation { get; set; }

        [Column("bank_id")]
        public int? BankId { get; set; }


        [Column("title")]
        [MinLength(1), MaxLength(128)]
        [Required]
        public String AccountTitle { get; set; }

        [Column("number")]
        [StringLength(50)]
        public String AccountNumber { get; set; }

        [Column("balance_statement")]
        public double? BalanceStatement { get; set; }

        [Column("balance_xero")]
        public double? BalanceXero { get; set; }

        [Column("last_statement_date")]
        public DateTime? LastStatementDate { get; set; }

        [Column("reconciled")]
        public BankAccountReconciled? Reconciled { get; set; }

        [Required]
        [Column("uuid")]
        [StringLength(256)]
        public string AccountUuid { get; set; }

        [Column("orders")]
        public int Orders { get; set; }

        public override int GetHashCode()
        {
            return Id.GetHashCode();
        }

        public override bool Equals(Object obj)
        {
            // TODO: Warning - this method won't work in the case the id fields are not set
            if (!(obj is XeroBankAccount))
            {
                return false;
            }
            XeroBankAccount other = (XeroBankAccount)obj;
            return Id == other.Id;
        }

        public override String ToString()
        {
            return "org.syncbank.entity.XeroBankAccount[ accountId=" + Id + " ]";
        }
    }
}

SQL xero_bank_account:

CREATE TABLE `xero_bank_account` (
  `id` int(11) NOT NULL,
  `organisation_id` int(11) NOT NULL,
  `bank_id` int(11) DEFAULT NULL,
  `title` varchar(128) NOT NULL,
  `number` varchar(50) DEFAULT NULL,
  `balance_statement` decimal(12,2) DEFAULT NULL,
  `balance_xero` decimal(12,2) DEFAULT NULL,
  `reconciled` enum('true','false') NOT NULL DEFAULT 'false',
  `last_statement_date` datetime DEFAULT NULL,
  `uuid` varchar(256) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  `orders` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `xero_bank_account`
--
ALTER TABLE `xero_bank_account`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `account_uuid` (`uuid`),
  ADD KEY `account_title_caption` (`number`),
  ADD KEY `bank_id` (`bank_id`);

【问题讨论】:

  • var result = dbContext.XeroBankAccounts.FirstOrDefault(x => x.AccountUuid == tempUuid);
  • 你的结果是一个集合而不是一个对象。
  • 抱歉,初始错误已解决,当我使用 Linq 时,我得到 {"Input string was not in a correct format."}
  • 你不能把你的帖子改成一个全新的问题。
  • @DavidG 我的错对不起

标签: c# entity-framework linq


【解决方案1】:

您正在尝试使用 .Where() lambda 表达式将 XeroBankAccount 的集合转换为 XeroBankAccount 的单个对象,这就是您遇到转换异常的原因。

如果你想得到你的查询必须返回XeroBankAccount的单个对象,那么你可以使用以下任何一种

var result = (XeroBankAccount) dbContext.XeroBankAccounts.Where(x => x.AccountUuid == tempUuid).FirstOrDefault();

var result = (XeroBankAccount) dbContext.XeroBankAccounts.FirstOrDefault(x => x.AccountUuid == tempUuid);

var result = (XeroBankAccount) dbContext.XeroBankAccounts.Where(x => x.AccountUuid == tempUuid).Take(1).SingleOrDefault();

【讨论】:

  • 我试过var result = (XeroBankAccount) dbContext.XeroBankAccounts.FirstOrDefault(x => x.AccountUuid == tempUuid,现在我得到:'dbContext.XeroBankAccounts.SingleOrDefault(x => x.AccountUuid == tempUuid)' 抛出了一个类型为'System.ArgumentException'的异常跨度>
  • 能否提供确切的异常信息?
  • 我正在编辑我的问题,我错误地点击了提交,答案比我编辑我的问题更快!对此感到抱歉
  • 错误是:“方法 System.Data.Entity.Core.Objects.ObjectQuery1[T] MergeAs(System.Data.Entity.Core.Objects.MergeOption) contains generic parameters"
  • 这里是:string tempUuid = uuid; var result = dbContext.XeroBankAccounts.SingleOrDefault(x => x.AccountUuid == tempUuid); return result;
猜你喜欢
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多