WCF,Linq错误:无法隐式转换类型System.linq.iorderedQueryable<>到System.Collection.Generic.List<>

时间:2012-04-23 21:41:12

标签: wcf linq entity-framework

我收到错误:我正在使用实体框架,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服务。 我已将xDataModel.dll文件附加到我的xServiceLibrary中,以便我可以查询我的EF模型。

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

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

问题是你有两个不同的类,都叫做Info,在你运行查询时都在范围内。这是非常非常糟糕的事情,特别是如果你认为他们是同一个班级的话。

如果DataModel.InfoServiceLibrary.Info是同一个类,则需要找出它们同时在范围内的原因并修复它。

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

  1. 通过致电List<DataModel.Info>
  2. 返回query.ToList()
  3. 通过复制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
            };
    
  4. 返回其他内容,例如您的自定义DTO对象,类似于#2但只包含您需要的特定字段(例如,如果ServiceLibrary.Info是一个您不想传递的重物。

  5. 一般而言,您的问题集中在编译器将List<Info>解释为List<ServiceLibrary.Info>并且您可能不希望它的事实。