2013-12-16 2 views
0

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

Вот моя схема базы данных:

Items Table: ID, Code, ItemTypeID, Name, StatusID 
ItemType Table: ID, Name 
Status Table: ID, Status 

Как вы видите, существует взаимосвязь между пунктами и таблицами ItemType, и есть еще один между пунктами и таблицами состояния.

Я хочу создать метод, который будет извлекать все элементы под каждым статусом. Например, у меня есть 3 статуса; Активный, Неактивный, Ожидание. Итак, как я могу получить все элементы под каждым статусом? Должен ли я разработать один метод для каждого статуса? Должен ли я использовать Enum?

До сих пор я придумал метод общего GetDate() для элементов таблицы:

// Properties 
public int ID { get; set; } 
public string Code { get; set; } 
public int ItemTypeID { get; set; } 
public string Name { get; set; } 
public int StatusID { get; set; } 

public IEnumerable<Items> getDate() 
{ 
    List<Items> itemsList = new List<Items>(); 
    using (ItemsDBEntities context = new ItemsDBEntities()) 
    { 
     itemsList = 
      (from item in context.Items 
      select new Items() 
      { 
       Code = item.Code, 
       Name = item.Name 
      }).ToList(); 
    } 
    return itemsList; 
} 
+0

возможно вам нужно [group clause] (http://msdn.microsoft.com/ru-ru/library/bb384063.aspx) или [join..into] (http://msdn.microsoft.com/ru-ru/library /bb311040.aspx) – Grundy

ответ

0
public enum ItemStatus //in accordance with the Status Table 
{ 
    Active = 1, 
    Inactive = 2, 
    Pending = 3 
} 

    public IEnumerable<Items> getDate(params ItemStatus[] selectStatus) 
    {  
     using (var context = new ItemsDBEntities()) 
     { 
     return context.Items 
       .where(item=> selectStatus.Contains((ItemStatus)item.StatusID)) 
       .select new Items() 
       { 
       Code = item.Code, 
       Name = item.Name, 
       StatusID = item.StatusID 
       }).ToList(); 
     }   
    } 

И с помощью:

var listItems = getDate(ItemStatys.Active, ItemStatys.Inactive); //needed category 
+0

Спасибо за помощь. Я очень ценю это. Есть ли способ сделать это родовым, а не жестко закодированным статусом? Какая из них лучше? – user3107976

+0

Вы можете использовать шаблон t4 для статуса enum –

0

Возможно, вам нужно использовать join..into clause как этот

public Dictionary<string,IEnumerable<Items>> getData() 
{ 

    using (ItemsDBEntities context = new ItemsDBEntities()) 
    { 
     return (from status in context.Status 
       join item in context.Items on status.ID equals item.StatusID into itemsByStatus 
       select new 
       { 
        StatusName = status.Status, 
        items = itemsByStatus.Select(i=> 
         new Items() 
         { 
          Code = i.Code, 
          Name = i.Name, 
          StatusID = i.StatusID 
         }) 
       }).ToDictionary(e=>e.StatusName, e=>e.items); 
    } 
} 

UPDATE
для сценария от комментариев

getData обратный словарь, где Keys это все названия статусов, при выборе статуса в списке вы должны связать GridView дорожить из словаря, как этот

var selectedStatus = dropdownlist.SelectedValue; 
var data = getData(); 

gridView.DataSource = data[selectedStatus]; 
gridView.DataBind(); 
+0

Большое вам спасибо за помощь. Тем не менее, я пытаюсь использовать ваш метод с элементом управления DropDownList, который будет отображать все статусы и на основе выбранного значения, будет отображаться GridView с отображением элементов с выбранным статусом. Не могли бы вы рассказать мне, как использовать ваш метод с этим сценарием? – user3107976

+0

@ user3107976 Я обновляю ответ – Grundy

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