【问题标题】:Finding record using LINQ WCF Ado.net "Does not match return type"使用 LINQ WCF Ado.net“不匹配返回类型”查找记录
【发布时间】:2015-08-11 17:57:30
【问题描述】:

我正在尝试使用 ID 搜索记录。 我有成功返回所有记录的代码,但是我不确定如何只返回一个匹配的记录。

我正在使用 C#、linq、WCF 和 ADO.net 数据服务。如果这是一个骗局,我很抱歉,有人可以解释我哪里出错了。我对这种语言没有经验。

public List<Vehicle> SearchVehicleRecord(int vehicleID)
        {

            VehicleStockItem vehicle =
                (from v in db.VehicleStockItems
                 where v.VehicleStockItemID == vehicleID
                 select v
                 ).First();
            return vehicle;
        }

我收到的错误是“错误 1 ​​'VehicleSalesService.Service1' 没有实现接口成员 'VehicleSalesService.IService1.SearchVehicleRecord(int)'。'VehicleSalesService.Service1.SearchVehicleRecord(int)' 无法实现 'VehicleSalesService.IService1.SearchVehicleRecord (int)' 因为它没有匹配的返回类型 'System.Collections.Generic.List'。C:\Users\Dale\Documents\Visual Studio 2012\Projects\VehicleSalesService\VehicleSalesService\Service1.cs 12 18 VehicleSalesService"

“错误 2 无法将类型 'VehicleSalesService.Models.VehicleStockItem' 隐式转换为 'System.Collections.Generic.List' C:\Users\Dale\Documents\Visual Studio 2012\Projects\VehicleSalesService\VehicleSalesService\Service1.cs 64 20 VehicleSalesService"

这是操作

    [OperationContract]
    List<Vehicle> SearchVehicleRecord(int vehicleID);

这是VehicleStockItem的定义

public partial class VehicleStockItem
    {
        public int VehicleStockItemID { get; set; }
        public int ColourID { get; set; }
        public int VehicleTypeID { get; set; }
        public int WheelTypeID { get; set; }
        public string Make { get; set; }
        public string Model { get; set; }
        public string Registration { get; set; }
        public decimal Price { get; set; }
        public int Capacity { get; set; }
        public bool Automatic { get; set; }
        public bool Sold { get; set; }
        public System.DateTime StockEntryDate { get; set; }
        public System.DateTime DateNew { get; set; }
        public string Notes { get; set; }

        public virtual Colour Colour { get; set; }
        public virtual VehicleType VehicleType { get; set; }
        public virtual WheelType WheelType { get; set; }
    }

【问题讨论】:

    标签: c# linq wcf visual-studio-2012 wcf-data-services


    【解决方案1】:

    当您创建方法 SearchVehicleRecord(int vehicleID) 时,您已声明它将返回车辆列表。

    但是,在您的 linq 查询中,当您调用 .First() 时,您会挑选出一辆 SINGLE 车辆并将其存储在您的 VehicleStockItem 车辆中。然后,当方法需要您返回的是车辆列表时,您返回单个 VehicleStockItem 对象。

    实际上,有两个问题:您定义了返回车辆列表的方法,但实际上既不返回列表也不返回车辆,而是返回单个 VehicleStockItem。 (它说返回车辆,但这只是您创建的 VehicleStockItem 类型对象的特定名称。)

    尝试将您的方法签名更改为

       public VehicleStockItem SearchVehicleRecord(int vehicleID)
        {
    
            VehicleStockItem vehicle =
                (from v in db.VehicleStockItems
                 where v.VehicleStockItemID == vehicleID
                 select v
                 ).First();
            return vehicle;
        }
    

    这需要返回一个 VehicleStockItem,这就是你给它的。

    【讨论】:

    • 运营合约呢?这必须改成什么?
    • 好吧,我也是一个初学者,对操作合约不太熟悉,但至少,由于似乎没有在任何地方定义 Vehicle 对象,你可以真的没有他们的名单。我建议也将其更改为 VehicleStockItem。单数。在任何情况下,您都希望传入多个车辆 ID 并将结果存储在一个列表中?
    【解决方案2】:

    您在方法实现中返回VehicleStockItem 的单个实例。

    您的方法签名表明您正在返回一个List&lt;Vehicle&gt; 集合。

    你可以重载你的方法,这样你就有一个实现,当你传入一个 id 时返回一条记录,一个方法根据传入的任何参数返回一个集合。

    根据您是添加还是替换现有方法,您将添加或更新合同

     [OperationContract]
     VehicleStockItem SearchVehicleRecord(int vehicleID);
    

    然后您将更新您的签名以匹配您的合同:

      public VehicleStockItem SearchVehicleRecord(int vehicleID)
        {
    
            VehicleStockItem vehicle =
                (from v in db.VehicleStockItems
                 where v.VehicleStockItemID == vehicleID
                 select v
                 ).First();
            return vehicle;
        }
    

    【讨论】:

    • 能否提供一个例子,谢谢。我只希望返回一条记录。
    • 新合约现在说它找不到类型或命名空间 VehicleStockItem。当我添加“Using VehicleSalesService.models”时,它会删除错误,但是当我调用该服务时,它会返回一个错误,指出该序列不包含任何元素。
    • 您的代码正在崩溃,因为查询没有返回数据,并且使用 First() 需要序列中的数据(您的查询)。如果您预计有时不会返回任何结果,请使用FirstOrDefault(),它会在没有结果时返回null
    • 当我返回一条我知道肯定存在的记录时,我收到以下错误:s28.postimg.org/i67o5aowt/error_WCF.jpg 我觉得这很奇怪,因为我可以运行代码来获取所有记录,但不是这个。有什么想法吗?
    【解决方案3】:

    我们来看看方法:

    public List<Vehicle> SearchVehicleRecord(int vehicleID)
            {
    
                VehicleStockItem vehicle =
                    (from v in db.VehicleStockItems
                     where v.VehicleStockItemID == vehicleID
                     select v
                     ).First();
                return vehicle;
            }
    

    有什么问题:

    • 具有返回类型,但返回不同类型的内容
    • 返回 VehicleStockItem,但期望返回 List

    也许你应该修改你的方法,像这样:

    public VehicleStockItem SearchVehicleRecord(int vehicleID)
            {
    
                VehicleStockItem vehicle =
                    (from v in db.VehicleStockItems
                     where v.VehicleStockItemID == vehicleID
                     select v
                     ).First();
                return vehicle;
            }
    

    如果您执行此操作,请确保使用您的 OperationContract 并在您定义 OperationContract 的位置定义 VehicleStockItem

    您可以修改您的方法以返回包含您想要的单个元素的列表。

    或者,您可以将vehicle 转换为Vehicle 并修改OperationContract 以期望Vehicle 结果而不是ListVehicle 元素。

    【讨论】:

    • 嗨@LajosArpad VehicleStockItem 是在模型中自动定义的。现在我已经按照您对操作合同的建议进行了如下设置: [OperationContract] VehicleStockItem SearchVehicleRecord(int vehicleID); ....当我调用该服务时,它给出了一个错误并说“序列没有元素”,就好像它没有找到任何记录一样?
    • 看来你需要在那里使用一个列表。在这种情况下,您可以创建一个包含单个元素的列表来解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多