2

我有一个绑定到表的LINQ to SQL查询函数,但该函数在“return res.ToList();”上给出错误。

  • imo_no 是 int
  • position_cordinates 是字符串
  • 船只 ID 是 int
  • 设备是字符串。

我的功能:

List<T> GetAllInitialize()
{
    PositionDataClassesDataContext context = new PositionDataClassesDataContext();

    var res = from positions in context.it_positions
              join vessels in context.it_vessels on positions.imo_no equals vessels.imo_no
              select new { positions.imo_no, positions.position_cordinates, vessels.vessel_id, vessels.equipment };

    return res.ToList();
}

在此处输入图像描述

4

3 回答 3

1

尽管您可以通过静态类型在本地使用匿名类型或匿名类型对象的集合,但无法在不丢失有关其静态类型的信息的情况下从函数中返回它们。

如果您不能或出于某种原因不想创建命名类来保存返回数据,则需要 returnList<dynamic>List<object>. 这两种方法都有其缺点:dynamic将比可比较的静态类型对象慢,同时System.Object不会让您对返回的数据做太多事情。

最好的解决方案是创建一个命名的返回类型:

public class PositionData {
     public int ImoNo {get;set;}
     public string PositionCordinates {get;set;}
     public int VesselId {get;set;}
     public string Equipment  {get;set;}
}

现在您的查询将如下所示:

select new PositionData {
    ImoNo = positions.imo_no
,   PositionCordinates = positions.position_cordinates
,   VesselId = vessels.vessel_id
,   Equipment = vessels.equipment
};

您的方法的返回类型将更改为List<PositionData>.

于 2013-02-12T18:51:54.790 回答
0
  1. 创建一个包含四个属性的新类,这些属性代表您的匿名对象所具有的那些字段。

  2. 更改select方法以创建此新自定义类型的实例,而不是使用匿名类型。

  3. 将方法的返回类型从返回更改为List<T>返回该自定义类型的列表。

匿名对象并非设计用于在创建它们的范围之外使用。因为您打算在多个范围内使用此类型,您应该创建一个新的命名类型来表示此数据。

于 2013-02-12T18:51:57.123 回答
0

您不能在具有泛型类型参数的方法签名中返回匿名类型。

你可以:

  1. 有你的返回签名List<object>,在这种情况下你不能访问任何字段,因此你需要反射来访问你的字段值。
  2. 返回List<dynamic>并丢失对字段引用的编译类型类型检查,但是它们将是“可访问的”。
  3. 声明一个由查询填充的中间具体类型,并在方法签名中指定为返回类型。

在我看来,第三种选择确实是唯一可行的选择。

于 2013-02-12T18:52:13.807 回答