2012-01-04 2 views
0

Я пытаюсь преобразовать проект ASP.NET в инфраструктуру Entity. Как переписать следующий запрос в эквивалент LINQ?LINQ эквивалент для SQL

SELECT {Table1 objects} 
FROM [Table1] tb1 
INNER JOIN [Table2] tb2 
ON tb1.Table1ID = tb2.fk_Table1ID 
WHERE tb2.fk_attrib1 = '123' AND tb2.fk_attrb2 = '345' 
ORDER BY tb1.attrib1 

В результате коллекция Table1 объектов. Здесь Table1 и Table2 соответствуют объекту System.Data.Objects.ObjectSet ADO.NET Entity Framework.

ответ

2
var results = from tb1 in Context.Table1 
       join tb2 in Context.Table2 on tb1.Table1ID == tb2.fk_Table1ID 
       where tb2.fk_attrib1 == "123" && tb2.fk_attrb2 == "345" 
       orderby tb1.attrib1 
       select tb1; 
2

Что-то вроде этого:

context.Table1 
    .Where(o => o.Table2s.Any(o2 => 
     o2.fk_attrib1 == '123' && 
     o2.fk_attrib2 == '345')) 
    .OrderBy(o => o.attrib1) 
    .ToList(); 

КСТАТИ LINQPad отлично подходит для пробуя L2E запросов.

+0

Не видите ссылку InnerJoin. – Tigran

+1

Это соединение для вас - попробуйте LINQPad, чтобы увидеть сгенерированный SQL. Указание соединения в L2E обычно является запахом кода. –

1

Это должно помочь вам немного. Я полагаю, что главная проблема заключается в том, что JOIN - EF вы можете использовать NavigationProperties, и вам не нужно беспокоиться о соединении столов - EF позаботится об этом.

Также вы пытаетесь фильтровать столбец из объединенной таблицы. Это можно сделать с помощью метода Any, чтобы найти все Table1 элементов, которые подключены к Table2, где эти ссылочные элементы имеют определенные свойства/столбцы. Вы также должны ознакомиться с методом All, так как он может быть вам полезен в будущем.

from t1 in context.Table1 
where t1.Table2s.Any(t2.fk_attrib1 == "123" && t2 => t2.fk_attrb2 == "345") 
order by t1.attrib1 
select t1; 

Edit:
Я полагаю, что существует связь между 1:nTable1 и Table2 что приводит к перечислимому коллекции, как NavigationProperty в Table1 объектах.

Edit2:
Исправлена ​​ошибка в коде - не заметила, что оба атрибуты из Table2 не Table1

+0

Помимо других заданий, это самый элегантный дизайн. – ivowiblo

0

Если быть что-то вроде этого:

var result = (from tb1 in Table1 
       from tb2 in Table2 
         where tb1.Key == tb2.Key && 
           tb2.fk_attrib1 = '123' && 
            tb2.fk_attrb2 = '345' 
      select ione).OrderBy(p=>p.attrib1); 

Надеется, что это помогает ,

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