Как правильно переписать этот запрос linq? - PullRequest
0 голосов
/ 20 сентября 2011
int id =2 ;
(from t1 in Table1
 join t2 in Table2
 on new { t1.id, id} equals new { t2.id, t2.otherid }
 select t1).ToList();

В настоящее время приведенный выше запрос выдает ошибку компиляции:

Неверно указан тип одного из выражений объединения.

Как вы можете видеть в приведенном выше запросе, я хочу объединить одно целое значение, как в sql. Я хочу сделать так, чтобы запрос выполнялся быстрее, и я не хочу делать «где» в конце, потому что это будет означать, что он получит все строки, а затем отфильтрует с предложением «где». Поскольку в обеих таблицах много строк, было бы хорошо, если бы я мог фильтровать строки в самом предложении соединения. Спасибо за вашу помощь!

Ответы [ 3 ]

4 голосов
/ 20 сентября 2011

Когда вы присоединяетесь, используя анонимные классы, члены имен этих классов должны совпадать. Эта проблема легко решается добавлением имен членам анонимного класса:

int id = 2;

(from t1 in Table1
 join t2 in Table2
 on new { Id = t1.id, OtherId = id } 
     equals new { Id = t2.id, OtherId = t2.otherid }
 select t1).ToList();

Хотя, чем больше я на это смотрю, тем больше понимаю, что соединение не должно быть таким сложным. Похоже, вы добавляете статический идентификатор в объединение. Вы должны иметь возможность обойтись без него в предложении where, которое уменьшит объединение до одного значения:

int id = 2;

(from t1 in Table1
 from t2 in Table2
 on t1.id equals t2.id
 where t2.otherid = id
 select t1).ToList();
4 голосов
/ 20 сентября 2011

Вам необходимо использовать один и тот же анонимный тип (с одинаковыми именами свойств) в обеих половинах объединения:

on new { t1.id, otherId = 2 } equals new { t2.id, t2.otherId }

Ваш текст подразумевает, что вы действительно хотите объединить одно значение;если это так, вам вообще не нужен анонимный тип:

on t1.id equals t2.otherid
0 голосов
/ 20 сентября 2011

Я вижу два возможных решения:

Этот вариант предварительно фильтрует Table2, затем выполняет соединение.

int id =2;
    (from t1 in Table1
    join t2 in (from a in Table2 where a.otherid == id select a)
    on t1.id equals t2.id
    select t1).ToList(); 

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

int id =2;
    (from t1 in Table1
    join t2 in Table2
    on new { Id1 = t1.id, Id2 = id } equals new { Id1 = t2.id, Id2 = t2.otherid }
    select t1).ToList(); 

HTH, Mark

...