2013-03-22 2 views
0

Я пытаюсь написать запрос LINQ2Entity, который будет возвращать только 3 столбца из таблицы, а затем установить результат как DataSourceComboBox.LINQ to Entity - использование анонимного объекта в запросе

Проблема у меня есть это. Во-первых - выбрать все из таблицы я использую сервис так:

IList<SoleColor> soles = SoleColorService.All().ToList(); 

который готов быть установлен в качестве DataSource для ComboBox, который ожидает данные этого типа. Однако, потому что я хочу, чтобы выбрать анонимный объект для хранения только 3 из столбцов, результат запроса я изменил мой запрос, как это:

IList<SoleColor> soles = SoleColorService.All() 
        .GroupBy(t => t.Sole.Code) 
        .Select(g => new 
        { 
         SoleCode = g.Key, 
         SoleName = g.Select(t => t.Sole.Name), 
         SoleId = g.Select(t => t.SoleID) 
        }); 

что приводит к случаю .Select как ошибка с текстом «Не удается неявно преобразовать тип System.Linq.IQueryable для System.Collections.Generic.IList ". Если я изменю IList<SoleColor> soles = на var soles =, это нормально, но тогда есть проблема с назначением анонимного типа, такого как DataSource, но я думаю, что это может быть исправлено в запросе, поэтому я получаю правильный тип там. Также в какой-то момент я должен добавить что-то вроде First() или FirstOrDafult() к запросу y, потому что у меня много записей с тем же SoleCode, и я хочу сохранить только один для каждого уникального SoleCode.

ответ

1

Первое: как получить только один результат за группу. Я уже показал вам ваш предыдущий вопрос. В сочетании с анонимного типа это будет выглядеть так:

SoleColorService.All() 
       .GroupBy(t => t.Sole.Code) 
       .Select(g => g.First()) 
       .Select(x => new 
       { 
        SoleCode = x.Sole.Code, 
        SoleName = x.Sole.Name), 
        SoleId = x.SoleID) 
       }); 

Во-вторых: Если вам нужно возвращать результат этого запроса в сильном типизированного образом из метода вы не можете использовать анонимный тип. Вы должны создать именованный тип и использовать его вместо:

public class SoleModel 
{ 
    private readonly string _code; 
    private readonly string _name; 
    private readonly int _id; 

    public SoleModel(string code, string name, int id) 
    { 
     _code = code; 
     _name = name; 
     _id = id; 
    } 

    public string Code { get { return _code; } } 
    public string Name { get { return _name; } } 
    public int Id { get { return _id; } } 
} 

SoleColorService.All() 
       .GroupBy(t => t.Sole.Code) 
       .Select(g => g.First()) 
       .Select(x => new SoleModel(x.Sole.Code, x.Sole.Name x.SoleID)); 

Третье: Присвоение списка анонимных типов к источнику данных должен работать.

var result = SoleColorService.All() 
          .GroupBy(t => t.Sole.Code) 
          .Select(g => g.First()) 
          .Select(x => new 
          { 
           SoleCode = x.Sole.Code, 
           SoleName = x.Sole.Name), 
           SoleId = x.SoleID) 
          }); 
someControl.DataSource = result; 
+0

Спасибо. Из-за проблемы с производительностью мне пришлось изменить код вчера. Он должен загружать форму быстрее, если в 'Select' есть только 3 свойства или, по крайней мере, именно поэтому я делаю эту модификацию. Для уникальных записей - я пытался поставить 'First()' в самом конце запроса, так что очевидно, что это была моя ошибка, не знала для этой опции '.Select (g => g.First())' , Это мой второй день работы с LINQ2Entities или LINQ2SQL, поэтому я надеюсь, что вы извините мое незнание - о типе - DataSource назначается настраиваемым методом, который ожидает определенный тип, поэтому мне это нужно. – Leron

+0

@Leron: Итак, это ответ на ваши вопросы или что-то еще неясно? BTW: выбор одного из трех столбцов, скорее всего, не повлияет на вашу производительность, если только у SoleColor не будет огромного количества столбцов или столбцов с огромным количеством данных. –

+0

Извините, я пытался прочитать то, что вы прочитали. Я принял ваш ответ. Я тоже не уверен в производительности, но это моя задача, поэтому ... по крайней мере, я надеюсь научиться работать с Linq2Entities.Thanks – Leron