2013-07-08 2 views
1

Я пытаюсь создать функцию для захвата списка <>() типа «tableContact», который является сущностью (вроде как, когда вы делаете простой оператор select: query.ToList();)Entity Framework присоединиться к функции в функции

Но это становится расстраивающим, потому что я продолжал получать ошибки «нулевого объекта ссылки». По какой-то причине инструкция «join» не работает, поэтому я попробовал альтернативный оператор linq.

У меня есть таблица Object2Contacts, в которой я хочу LEFT JOIN, и я ищу свой объект и пытаюсь увидеть все контакты для этого объекта. Я также не могу понять, как изменить «анонимный тип» обратно в таблицу сущностей.

Также не каждый объект имеет контакты, поэтому иногда должен быть возвращен нулевой список <>.

public List<tableContact> getContactsForObject(int oid) 
    { 
     if (oid > 0) 
     { 
      var query = (from s in entities.tableContacts 
         from o in entities.tableObject2Contacts 
         where s.contact_id == o.contact_id 
         where o.object_id == oid       
         select new { s }); 
      if (query != null) 
      { 
       IEnumerable<tableContact> e = (IEnumerable<tableContact>)query.ToList(); 
       return (List<tableContact>)e; 
      } 
     } 
     return new List<tableContact>(); 
    } 

Я хочу, чтобы затем цикл через объект возвращается ... например:

foreach (tableContact c in MyList){ 
    WriteLine(c.Name); 
} 

EDIT Я также попытался:

List<tableContacts> contacts = (from s in entities.tableContacts 
     join o in entities.tableObject2Contacts 
     on s.contact_id equals o.contact_id 
     where o.object_id == oid       
     select s).ToList(); 

Тогда я не могу преобразовать его обратно в список и по-прежнему «нулевую ссылку».

EDIT 2 Да, запрос, который я запускаю, может определенно ввести «пустой» список. Я не возражаю против пустых списков, но не должен давать ссылку на объект null.

ответ

1

Я хотел бы написать Соединить О себе немного иначе:

var query = (from s in entities.tableContacts 
      join o in entities.tableObject2Contacts 
        on new { ContactID = s.contact_id, ObjectID = oid } 
        equals new { ContactID = o.contact_id, ObjectID = o.objectID } 
        into oTemp 
      from o in oTemp.DefaultIfEmpty() 
      select new { s }); 

Это было бы надлежащим левой присоединиться с помощью LINQ. Возможно, ваше исключение NullReferenceException вызвано неправильным соединением или чем-то еще.

0

Nevermind, «Я также пробовал это», на самом деле правильный код, но по какой-то причине я не установил свои сущности должным образом, чтобы вернуть null.

Хотя я все еще очень смущен про «анонимные типы», я бы не знал, как создать функцию, которая возвращает «anonymoustype».

+0

Я еще более смущен, как компилируется строка «on s.contact_id == o.contact_id», она должна быть «на s.contact_id равна o.contact_id». Также функции не могут возвращать анонимные типы, вы должны превратить этот тип в класс и вернуть его. В теории вы могли бы создать класс, связанный с контактами, и предоставить ему свойства, которые вы хотите использовать из обеих таблиц, а затем в выбранном элементе выберите новый тип_задачи (Propertyname = s.property, PropertyName = o.property). См. Ссылку http: // stackoverflow. com/questions/1070526/how-to-return-anonymous-type-from-c-sharp-method-that-uses-linq-to-sql – Bearcat9425

+0

Правильно Я написал это неправильно. Я имел в виду «равный». Я не уверен, почему Линк, похоже, делает различие. Да, я запутался в анонимных типах и о том, как они работают. – Dexter

+0

@Dexter - Вы не можете возвращать анонимные типы .. поэтому вы путаетесь о том, как это сделать. Вы должны вернуть конкретный тип. –

Смежные вопросы