Объединение таблиц в LINQ / SQL - PullRequest
0 голосов
/ 24 августа 2009

У меня есть коллекция строк, каждая строка состоит из productid, unitid, countryid. Мне нужно найти детали для каждой строки в соответствующих таблицах (продукты, единицы, страна)

for product - select product name, updatedby  
for unitid  - select unit name , updatedby  
for countryid - select countryname, uploadby  

и возврат строк в том же формате

Id = product id or unitid or countryid
name = proudct name or unit name or countryname
modified = product updatedby or unit updated by or country uploadby

Итак, в итоге -

 1. For a Collection of rows
    a. use the id to get the extra details from the respective table
    b. return the same type of collection for the results
 2. do step 1 for 
    2.a For RegularToys (Run this logic on TableBigA)
    2.b For CustomToys(Run this logic on TableB)
 3. Return all the rows 
    by adding 2.a and 2.b

Как написать запрос sql / linq для этого? спасибо

Ответы [ 2 ]

0 голосов
/ 25 августа 2009

Если я правильно понимаю, вы хотите использовать данный идентификатор, чтобы найти продукт, единицу или страну, но вы не уверены, какая именно. Если это так, то вы можете создать отложенные запросы, например, чтобы найти заданную сущность:

var prod = from p in db.Products
           where p.ProductId = id
           select new { Id = p.ProductId, Name = p.ProductName, Modified = p.UpdatedBy };

var unit = from u in db.Units
           where p.UnitId = id
           select new { Id = u.UnitId, Name = u.UnitName, Modified = p.UpdatedBy };

var ctry = from c in db.Countries
           where c.CountryId = id
           select new { Id = c.CountryId, Name = c.CountryName, Modified = c.UploadBy };

И затем выполняйте запросы, пока не найдете подходящую сущность (при этом ?? является оператором null-coalesce, который возвращает правильное значение, если левый результат null).

var res = prod.SingleOrDefault() ??
          unit.SingleOrDefault() ??
          ctry.SingleOrDefault() ??
          new { Id = id, Name = null, Modifed = null };
0 голосов
/ 24 августа 2009

Без каких-либо дополнительных подробностей я не могу быть более конкретным в отношении приведенного ниже условия, но я думаю, что вы что-то просите в этом направлении. Я предполагаю, что ваши идентификаторы являются целыми (но это можно легко изменить, если нет), и у вас уже есть модель данных сущностей для описываемых вами таблиц.

  1. Создайте класс для ваших общих данных:

</p> <pre> class RowDetail { public int Id { get; set; } public string Name { get; set; } public string Modified { get; set; } } </pre> <p>

  1. Извлечь информацию из каждой вложенной таблицы в новую запись:

</p> <pre> IEnumerable<RowDetail> products = from p in db.Products where <<CONDITION>> select new RowDetail() { Id = p.ProductId, Name = p.ProductName, Modified = p.UpdatedBy }; IEnumerable<RowDetail> units = from u in db.Units where <<CONDITION>> select new RowDetail() { Id = u.UnitId, Name = u.UnitName, Modified = u.UpdatedBy }; IEnumerable<RowDetail> countries = from c in db.Countries where <<CONDITION>> select new RowDetail() { Id = c.CountryId, Name = c.CountryName, Modified = c.UploadBy }; </pre> <p>

  1. Наконец, соберите все записи в одну коллекцию:

</p> <pre> IEnumerable<RowDetail> results = products.Union(units).Union(countries); </pre> <p>

Я не уверен, что это именно то, что вы ищете, поэтому не стесняйтесь оставлять отзывы и / или более подробную информацию, если потребуется дополнительная помощь.

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