2017-01-11 2 views
0

Я пытаюсь получить результат запроса LINQ и передать его в другую функцию, чтобы использовать его.Тип возврата LINQ и использование в другой функции

Это моя первая функция, вызываемая из браузера. Затем вызывается GetAddressByIncID.

// GET: Hello/5 
public void GetModel(int? incID) 
    { 
     var incAddress = GetAddressByIncID(incID); 
     var siteID = GetSiteIDbyAddress(incAddress); 
     LoadSite(siteID); 
    } 

private ?returntype? GetAddressByIncID(int? incID) 
    { 
     var incAddress = (from address in db.Incs 
        where address.IncID == incID 
        select new 
        { 
         IncID = address.IncID, 
         Number = address.Number, 
         Direction = address.Direction, 
         StreetName = address.StreetName, 
         Zip = address.Zip, 
         City = city.CityDesc, 
         State = state.StateDesc 
        }).FirstOrDefault(); 
     return incAddress; 
    } 

На данный момент я могу получить результат запроса, который я хотел. Мне нужен только один или нулевой, поэтому я установил FirstOrDefault(). Внутри этой функции я могу получить доступ к значениям внутри incAddress, например incAddress.IncID, и я хочу сделать это в другой функции, когда он передается им. Поскольку его тип - Анонимный тип, я не уверен, какой тип возвращаемого значения я должен использовать.

Как только это возвращается, я передаю его другой функции, которая называется GetSiteIDbyAddress, чтобы узнать SiteID. Этот результат может быть кратным.

private ?returntype? GetSiteIDbyAddress(string incAddress) 
     {  
      var searchaddress = (from address in db.Addresses 
            where PrimaryAddressNumber == incAddress.Number && Direction == incAddress.Direction && StreetName == incAddress.StreetName 
            select new 
            { 
             SiteID = address.SiteID 
            }); 

      return searchaddress; 
     } 

Не могли бы вы дать мне предложение о возврате типа первой и второй функции? Я искал и пытался (список, массив и т. Д.), Но не смог найти отличное решение для него.

EDIT:

С предложениями, я редактировал мой код выглядит ниже. Теперь я могу использовать значения от IncAddress, чтобы перейти к другой функции. Однако возникает другая проблема.

public class IncAddress 
    { 
     public int IncID { get; set; } 
     public string Number { get; set; } 
     . 
     . 
    } 
public class IncSite 
{ 
    public int? SiteID { get; set; } 
    . 
    . 
} 

private IncAddress GetAddressByIncID(int incID) 
    { 
     var incAddress = (from address in db.Incs 
        where address.IncID == incID 
        select new IncAddress 
        { 
         IncID = address.IncID, 
         Number = address.Number, 
         Direction = address.Direction, 
         StreetName = address.StreetName, 
         Zip = address.Zip, 
         City = city.CityDesc, 
         State = state.StateDesc 
        }).FirstOrDefault(); 
     return incAddress; 
    } 

private IncSite GetSiteIDbyAddress(IncidentAddress incidentAddress) 
    {  
     var searchaddress = (from address in db.Addresses 
           where PrimaryAddressNumber == incAddress.Number 
           select new IncSite 
           { 
            SiteID = address.SiteID 
           }); 
     return searchaddress; 
    } 

На GetSiteIDbyAddress, я получаю говорит об ошибке:

Не может неявно преобразовать тип 'System.Linq.IQueryable < HelloWorld.Controllers.HelloController.IncSite>' на « HelloWorld.Controllers. HelloController.IncSite. Явное преобразования существует (вы пропали без вести броска?)

Я думаю, это потому, что я не ставил FirstOrDefault(), потому что я ожидал множественная запись будет найдена этим запросом. Как я могу выполнить эту функцию, чтобы получить несколько результатов?

+1

Создать класс для хранения данных. В вашей инструкции LINQ используйте 'new myClass' вместо' new', и вы можете вернуть тип 'myClass'. – Tim

+0

Возможный дубликат результатов [Вернуться к анонимному типу?] (Http://stackoverflow.com/questions/534690/return-anonymous-type-results) – BACON

+1

Очевидно, что это не очень хорошая практика для прохождения анонимного типа. Поэтому, если вам нужно использовать результирующий набор вне запроса или метода/функции, вы должны сделать это как «не повезло», сказанное в его ответе, и создать класс. Лично не нравится использование 'var', мне нравится объявлять вещи тем, чем они являются. – Edward

ответ

1

Вы можете сделать это двумя способами, либо путем создания нового класса Пусть это будет некоторый Address с этими выбранными значениями как поля и в этом случае тип возвращаемого значения будут уважать в Address (адрес, если вы используете FirstOrDefault, List, если вы используете .ToList() и так далее). Или вы можете указать тип возврата как dynamic, в этом случае другие изменения не требуются.Но я предлагаю вам создать класс, если это возможно, и избежать использования dynamic в этом случае, так как

это намного медленнее и не будет иметь то же самое время компиляции проверки ошибок в качестве надлежащего класса

обновления в соответствии с комментарием Давида

Случай 1:

//definition should be something like this 
public class Address 
{ 
    public string IncID { get; set; } 
    public string Number { get; set; } 
    public string Direction { get; set; } 
    public string StreetName { get; set; } 
    public string Zip { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
} 

и метод должен быть таким:

private Address GetAddressByIncID(int? incID) 
{ 
    var incAddress = (from address in db.Incs 
       where address.IncID == incID 
       select new Address 
       { 
        IncID = address.IncID, 
        Number = address.Number, 
        Direction = address.Direction, 
        StreetName = address.StreetName, 
        Zip = address.Zip, 
        City = city.CityDesc, 
        State = state.StateDesc 
       }).FirstOrDefault(); 
    return incAddress; 
} 

Случай 2

private dynamic GetAddressByIncID(int? incID) 
{ 
    var incAddress = // Query here 

    return incAddress; 
} 
+1

Следует отметить, что динамика намного медленнее и не будет иметь одинаковые проверки ошибок времени компиляции как надлежащий класс –

+0

@DavidS .: Спасибо за ценный инф. Я процитировал их в обновленном ответе –

+0

Спасибо вам, что вам не повезло. Я изменил свой код с вашим предложением. Однако я столкнулся с другой проблемой. Я редактировал свое оригинальное сообщение и, пожалуйста, дайте мне совет, как получить несколько результатов запроса. –

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