Linq - Как запросить определенные столбцы и вернуть списки - PullRequest
2 голосов
/ 31 марта 2010

Я пытаюсь написать запрос linq, который будет возвращать только определенные столбцы из моего объекта сущности в объект списка.

Ниже приведен мой код, который выдает ошибку (не может неявно преобразовать общий список анонимных типов в общий список типа TBLPROMOTION):

IQueryable<TBLPROMOTION> matches = webStoreContext.TBLPROMOTION.Include("TBLSTORE").Include("LKPROMOTIONTYPE");

List<TBLPROMOTION> promotionInfo = null;

promotionInfo = (from p in matches
                orderby p.PROMOTION_NM descending
                select new { p.EFFECTIVE_DT, p.EXPIRE_DT, p.IS_ACTIVE, 
                p.PROMOTION_DESC, p.PROMOTION_ID, p.PROMOTION_NM }).ToList();

Что было бы лучшим способом для достижения этой цели. Я не хочу делать «выбрать p» в этом случае и вернуть все столбцы, связанные с запросом.

спасибо заранее, Билли

Ответы [ 7 ]

5 голосов
/ 31 марта 2010

Не могли бы вы сделать var promotionInfo = () и получить список анонимных типов?

4 голосов
/ 31 марта 2010

Хорошо, в принципе вы не можете привести анонимный тип к известному типу, например TBLPROMOTION.

конечно, вы можете сказать var promotionInfo =, а затем получить IEnumerable<{Anonymoustype}> и использовать это для того, что вы хотели сделать с promotionInfo.

Кроме того, лично я предпочитаю Свободную версию запроса linq, легкую на глаза, хорошую диету программирования, по крайней мере для меня:)

var promotionInfo = matches
                .OrderByDescending( p => p.PROMOTION_NM)
                .Select( p => new { p.EFFECTIVE_DT, 
                                p.EXPIRE_DT, 
                                p.IS_ACTIVE, 
                                p.PROMOTION_DESC, 
                                p.PROMOTION_ID, 
                                p.PROMOTION_NM})
                .ToList();
1 голос
/ 07 января 2014

@ Билли, следующий код работал для меня.

List<TBLPROMOTION> promotionInfo = 
                      (from p in matches
                       orderby p.PROMOTION_NM descending
                       select new TBLPROMOTION(p.EFFECTIVE_DT, p.EXPIRE_DT, p.IS_ACTIVE, 
                                       p.PROMOTION_DESC, p.PROMOTION_ID, p.PROMOTION_NM)
                      ).ToList();
1 голос
/ 31 марта 2010

Если вы переходите от запроса L2E к уже определенному типу, вам может потребоваться шаг между ними. Я не пытался скомпилировать это, но что-то вроде:


   List<code><TBLPROMOTION></code> promotions = new List<code><TBLPROMOTION></code>();</p>

<p>var results = from p in matches
       orderby p.PROMOTION_NM descending
       select new
       {
           p.EFFECTIVE_DT,
           p.EXPIRE_DT,
           p.IS_ACTIVE,
           p.PROMOTION_DESC,
           p.PROMOTION_ID,
           p.PROMOTION_NM
       };</p>

<pre><code>   foreach (var v in results)
   {
       promotions.Add(new TBLPROMOTION(v.EFFECTIVE_DT, v.EXPIRE_DT, v.IS_ACTIVE, 
       v.PROMOTION_DESC, v.PROMOTION_ID, v.PROMOTION_NM));
   }

Основываясь на комментариях ниже, вы можете попробовать что-то вроде:


    foreach(var v in results)
    {
        TBLPROMOTION temp = new TBLPROMOTION();
        temp.EFFECTIVE_DT = v.EFFECTIVE_DT;
        temp.EXPIRE_DT = v.EXPIRE_DT;
        temp.IS_ACTIVE = v.IS_ACTIVE
        // Assign Other Properties</p>

<pre><code>    promotions.Add(temp);
}

....... Извините: Просто прочитайте дополнение к началу.

Вы уверены, что ни одно из полей, которые вы пропускаете (вместо слова "выбрать p"), ​​не является обязательным для объекта TBLPROMOTION? Кроме того, чувствуйте, что ваш объект TBLPROMOTION будет иметь свойства (и, следовательно, выделенную память) для этих пропущенных полей, почему бы просто не использовать анонимный тип или установить вспомогательный класс, который содержит только ваши необходимые свойства?

0 голосов
/ 31 марта 2010

Если вы хотите подмножество таблицы, у вас есть 2 варианта:

  • @ Фреду упомянул выбор нового TBLPROMOTION {...}

  • Другой способ - создать пользовательский DTO, который имеет точные свойства, и выбрать их вместо:

    Список акцийInfo = ... выберите новый TBLPROMOTION_DTO { Effective_dt = ... }

НТН

0 голосов
/ 31 марта 2010
List<TBLPROMOTION> promotionInfo = null;

promotionInfo = (from p in matches
                orderby p.PROMOTION_NM descending
                select new TBLPROMOTION { COL1 = p.EFFECTIVE_DT, COL2 = p.EXPIRE_DT, COL3 = p.IS_ACTIVE... }).ToList();

Где COL1, COL2, ... - это имена свойств в TBLPROMOTION, которые вы хотите заполнить.

0 голосов
/ 31 марта 2010

ты пробовал

 select new TBLPROMOTION {.....

вместо

 select new {.....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...