0

我收到一个错误:我正在使用实体框架 wcf。

Error:cannot implicitly convert type System.linq.iorderedQueryable<xDataModel.Info> to System.Collection.Generic.List<xServiceLibrary.Info>

以下是我的代码:


WCF 服务:

namespace xServiceLibrary
{
    public List<Info> GetScenario()
            {
                xEntities db = new xEntities();
                 var query = from qinfo in db.Infoes
                                select qinfo;

                  //return query.Cast<Info>().ToList(); (not working)
                  //return query.toList(); (not working)
                    return query;
       }
}

界面:

namespace xServiceLibrary
{
     [OperationContract]
            List<Info> GetScenario();
}

班级:

namespace xServiceLibrary
{
       [DataContract]
        public class Info
        {
            [DataMember]
            public int Scenario_Id;

            [DataMember]
            public string Scenario_Name { get; set; } 

            [DataMember]
            public string Company_Name { get; set; } 
        }
}

更新:(2) 我有两个类库文件。一个是 xDataModel 命名空间,我在其中创建了 xmodel.edmx 文件。第二个是 xServiceLibrary 命名空间,我在其中实现 Wcf 服务。我在我的 xServiceLibrary 中附加了 xDataModel.dll 文件,以便我可以查询我的 EF 模型。

我无法理解这个概念。任何帮助,将不胜感激。

4

2 回答 2

1

问题是您有两种不同的类型,分别命名为Info: DataModel.InfoServiceLibrary.Info- 因为它们是不同的类型,所以您不能将一种类型转换为另一种类型。

如果两者都在那里没有充分的理由,我会消除其中一个。否则,作为一种解决方法,您可以通过一一复制相关属性DataModel.Info来投影:ServiceLibrary.Info

var results = (from qinfo in db.Infoes
               select new ServiceLibrary.Info()
               {
                    Scenario_Id = qinfo.Scenario_Id,
                    //and so on
               }).ToList();
于 2012-04-23T21:47:10.830 回答
0

问题是您有两个不同的类,都称为Info,在您运行查询时都在范围内。这是一件非常非常糟糕的事情,尤其是如果您认为他们是同一个班级。

如果DataModel.InfoServiceLibrary.Info是同一个类,您需要弄清楚为什么它们同时在范围内并修复它。

如果它们是不同的类,您需要明确说明您要返回哪个类。假设您的 EF 模型包含一组DataModel.Info对象,您的选项有:

  1. 返回一个List<DataModel.Info>你可以通过调用得到的query.ToList()
  2. 返回 a List<ServiceLibrary.Info>,您可以通过从 DataModel.Info对象中复制字段来获得:

    var query = from qinfo in db.Info
            select new ServiceLibrary.Info
            {
              Scenario_Id = q.Scenario_Id,
              Scenario_Name = q.Scenario_Name
              Company_Name = q.Company_Name
            };
    
  3. 返回其他内容,例如您的自定义 DTO 对象,类似于 #2,但仅包含您需要的特定字段(例如,如果ServiceLibrary.Info是您不想传递的重对象。

但是,总的来说,您的问题集中在编译器解释List<Info>List<ServiceLibrary.Info>并且您可能不希望它解释的事实。

于 2012-04-23T21:50:41.580 回答