none
Сложный запрос в Linq RRS feed

  • Вопрос

  • Здравствуйте, необходимо сделать выборку запросом
    Первая таблица:
    Есть товар(номер), он продаётся в разных городах,
    соответственно в одном городе может быть много-много магазинов, где его продают.
    + ID

    Вторая таблица
    Есть список городов(не повторяющихся) всех всех + их ID

    Хочется сделать так, чтобы получить список городов из первой
    таблицы(чтобы не повторялись) и соответствующие id им из второй таблицы

    Подскажите пожалуйста - как это можно сделать??!??
    25 ноября 2011 г. 10:51

Ответы

  • > Есть товар(номер), он продаётся в разных городах [...] много магазинов, где его продают. [...] Есть список городов [...]  получить список городов из первой таблицы(чтобы не повторялись) и соответствующие id им из второй таблицы

     
    т.е. надо получить список городов, в которых хоть что-то продается.
     
    var products = new[] 
    {
        new { Name = "p0", Id = 0 },
        new { Name = "p1", Id = 1 },
        new { Name = "p2", Id = 2 },
    };
    var cities = new[] 
    {
        new { Name = "c0", Id = 0 },
        new { Name = "c1", Id = 1 },
        new { Name = "c2", Id = 2 },
        new { Name = "c3", Id = 3 },
        new { Name = "c4", Id = 4 },
    };
    var shops = new[] 
    {
        new { City = 0, Products = new [] { 0, 1 } },
        new { City = 0, Products = new [] { 1, 2 } },
        new { City = 1, Products = new [] { 0 } },
    };
    
    
     
    var cids = from s in shops group s by s.City into g select g.Key;
    var res = from cid in cids join c in cities on cid equals c.Id select c;
    foreach (var c in res)
        System.Diagnostics.Trace.WriteLine(c);
    

    или так 
     
    var ret = 
           from cid in (from s in shops select s.City).Distinct() 
           join c in cities on cid equals c.Id
           select c;
    foreach (var c in res)
        System.Diagnostics.Trace.WriteLine(c);
    


    результат:
    { Name = c0, Id = 0 }
    { Name = c1, Id = 1 }
     
      
    • Изменено Malobukv 27 ноября 2011 г. 3:21
    • Помечено в качестве ответа ansi_str 28 ноября 2011 г. 5:21
    27 ноября 2011 г. 3:21

Все ответы

  • > Есть товар(номер), он продаётся в разных городах [...] много магазинов, где его продают. [...] Есть список городов [...]  получить список городов из первой таблицы(чтобы не повторялись) и соответствующие id им из второй таблицы

     
    т.е. надо получить список городов, в которых хоть что-то продается.
     
    var products = new[] 
    {
        new { Name = "p0", Id = 0 },
        new { Name = "p1", Id = 1 },
        new { Name = "p2", Id = 2 },
    };
    var cities = new[] 
    {
        new { Name = "c0", Id = 0 },
        new { Name = "c1", Id = 1 },
        new { Name = "c2", Id = 2 },
        new { Name = "c3", Id = 3 },
        new { Name = "c4", Id = 4 },
    };
    var shops = new[] 
    {
        new { City = 0, Products = new [] { 0, 1 } },
        new { City = 0, Products = new [] { 1, 2 } },
        new { City = 1, Products = new [] { 0 } },
    };
    
    
     
    var cids = from s in shops group s by s.City into g select g.Key;
    var res = from cid in cids join c in cities on cid equals c.Id select c;
    foreach (var c in res)
        System.Diagnostics.Trace.WriteLine(c);
    

    или так 
     
    var ret = 
           from cid in (from s in shops select s.City).Distinct() 
           join c in cities on cid equals c.Id
           select c;
    foreach (var c in res)
        System.Diagnostics.Trace.WriteLine(c);
    


    результат:
    { Name = c0, Id = 0 }
    { Name = c1, Id = 1 }
     
      
    • Изменено Malobukv 27 ноября 2011 г. 3:21
    • Помечено в качестве ответа ansi_str 28 ноября 2011 г. 5:21
    27 ноября 2011 г. 3:21
  • Спасибо большое
    Всё работает
    • Изменено ansi_str 28 ноября 2011 г. 5:25
    28 ноября 2011 г. 4:51