2013-02-12 3 views
2

У меня есть функция запроса LINQ to SQL, сопоставляющая с таблицами, но функция дает ошибку при возврате res.ToList(); ".LINQ to SQL C# функция с int и String

  • imo_no является ИНТ
  • position_cordinates является строка
  • vessel_id является ИНТ
  • оборудование Строка.

Моя функция:

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(); 
} 

enter image description here

+1

Вы не можете возвращать анонимные типы. – SLaks

+2

Вам нужно вернуть список '', но ваш нет. Вы возвращаете список анонимных типов. Измените свой запрос LINQ, чтобы выбрать 'T', или вообще не используйте общие файлы, и используйте конкретный класс (или динамический с объектом expando). – vcsjones

ответ

1

Хотя вы можете использовать анонимные типы или коллекции объектов анонимного типа локально со статической типизации, нет никакого способа, чтобы вернуть их из функции без теряя информацию об их статическом типе.

Если вы не можете или по какой-либо причине не хотите создавать именованный класс для хранения возвращаемых данных, вам необходимо либо вернуть List<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>.

+0

Спасибо, это было хорошим решением для моей проблемы! – Solo

0
  1. Создайте новый класс, который содержит четыре свойства, которые представляют те поля, которые имеют ваш анонимный объект.

  2. Измените метод select, чтобы создавать экземпляры этого нового настраиваемого типа, а не использовать анонимный тип.

  3. Измените возвращаемый тип метода с возвратом List<T>, чтобы вернуть список этого нестандартного типа.

Анонимные объекты не предназначены для использования вне сферы действия, в которой они были созданы. Поскольку вы собираетесь использовать этот тип из нескольких областей, вы должны создать новый именованный тип для представления этих данных.

0

Вы не можете вернуть анонимный тип в сигнатуре метода с аргументом общего типа.

Вы можете:

  1. Есть свой обратный подпись List<object>, в этом случае вы не можете получить доступ к любому из полей, которые вы бы для этого необходимо отражение для доступа к своим значениям полей.
  2. Возврат List<dynamic> и терять тип типа типа проверки на полевых ссылках, однако они были бы «доступными».
  3. Объявите промежуточный конкретный тип, который заполнен вашим запросом и указан как тип возврата в вашей сигнатуре метода.

Третий вариант на самом деле является единственным жизнеспособным выбором здесь, на мой взгляд.