Как создать анонимные объекты типа IQueryable с использованием LINQ - PullRequest
4 голосов
/ 27 мая 2010

Я работаю в проекте ASP.NET MVC, где я создал два класса LinqToSQL. Я также создал класс репозитория для моделей и реализовал несколько методов, таких как LIST, ADD, SAVE, в этом классе, который обслуживает контроллер данными. Теперь в одном из классов репозитория я извлек некоторые данные с помощью соединений LINQ, как это.

private HerculesCompanyDataContext Company = new HerculesCompanyDataContext();
private HerculesMainDataContext MasterData = new HerculesMainDataContext();
public IQueryable TRFLIST()
{
var info = from trfTable in Company.TRFs
       join exusrTable in MasterData.ex_users on trfTable.P_ID equals exusrTable.EXUSER
       select new 
           {
               trfTable.REQ_NO,
               trfTable.REQ_DATE,
               exusrTable.USER_NAME,
               exusrTable.USER_LNAME,
               trfTable.FROM_DT,
               trfTable.TO_DT,
               trfTable.DESTN,
               trfTable.TRAIN,
               trfTable.CAR,
               trfTable.AIRPLANE,
               trfTable.TAXI,
               trfTable.TPURPOSE,
               trfTable.STAT,
               trfTable.ROUTING
           };
    return info;
}

Теперь, когда я вызываю этот метод из моего контроллера, я не могу получить список. Я хочу знать, не создавая пользовательский класс модели данных, как я могу вернуть объект анонимного типа, например IQueryable. И поскольку это не относится ни к одной модели данных, как можно ссылаться на этот список в представлении.

Ответы [ 2 ]

3 голосов
/ 27 мая 2010

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

Да, переход от гибких типов (таких как DataTables) к строго типизированным объектам является важной частью вашей стратегии решения. С LINQ-To-SQL вы сможете довольно легко вернуть строго типизированные объекты. Ваши методы репозитория должны возвращать специально типизированные интерфейсы IQueryable, такие как IQueryable<TRF>, а не просто IQueryable. Или метод репозитория может просто возвращать один объект TRF или список этих объектов.

Имейте в виду, что анонимные типы и неявно типизированные переменные - две совершенно разные вещи. Для вас за кулисами компилятор создает анонимный тип. В этом случае не помещайте ваши данные в анонимный тип, как в примере запроса LINQ. Предполагая, что ваша сущность является trfTable, попробуйте это:

public IQueryable<trfTable> TRFLIST()
{
    var info = from trfTable in Company.TRFs
        join exusrTable in MasterData.ex_users on trfTable.P_ID equals exusrTable.EXUSER
        select new trfTable
    return info;
}

Преимущество этого заключается в том, что он использует огромное преимущество природы IQueryable, в том смысле, что добавленные вне вашего репозитория будут фактически добавлены в сгенерированный запрос. Это круто. Тем не менее, есть некоторые хорошие дебаты о том, является ли это лучшим способом сделать это.

Обратите внимание, что info здесь неявно введено компилятором , но не является анонимным типом . Это IQuerable<trfTable>. Это ключевое различие.

1 голос
/ 27 мая 2010

Вы можете вернуть анонимный тип, но не так, чтобы он был строго типизирован. Я использую этот метод для создания json-сериализуемых типов.

Возвращает тип «объекта» в классе модели данных:

public object TRFLIST()
{
    var info = from trfTable in Company.TRFs
    join exusrTable in MasterData.ex_users on trfTable.P_ID equals exusrTable.EXUSER
    select new 
       {
           trfTable.REQ_NO,
           trfTable.REQ_DATE,
           exusrTable.USER_NAME,
           exusrTable.USER_LNAME,
           trfTable.FROM_DT,
           <snipped>
       };
    return info;
}


Затем вызовите его из вашего контроллера следующим образом (в этом примере я использую его для возврата JsonResult):

public JsonResult() {
    var myAnonTRFLIST = dataClassInstance.TRFLIST();
    return Json(myAnonTRFLIST, JsonRequestBehavior.Allowget);
}


Вы также можете изучить использование нового динамического типа, если вы используете 4.0 ...


- ОБНОВЛЕНИЕ: Я только что попробовал это, и это сработало отлично -

Возвращает тип «объекта» в классе модели данных:

public List<object> TRFLIST()
{
    var info = from trfTable in Company.TRFs
    join exusrTable in MasterData.ex_users on trfTable.P_ID equals exusrTable.EXUSER
    select new 
       {
           trfTable.REQ_NO,
           trfTable.REQ_DATE,
           exusrTable.USER_NAME,
           exusrTable.USER_LNAME,
           trfTable.FROM_DT,
           <snipped>
       };
    return info.ToList<object>();
}

public JsonResult() {
    dynamic myAnonTRFLIST = dataClassInstance.TRFLIST();

    string test = myAnonTRFLIST[0].USER_NAME;
    <Do something with Test>

    return Json(myAnonTRFLIST, JsonRequestBehavior.Allowget);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...