2013-09-08 2 views
0

У меня есть необработанный запрос, который идет как это:Entity Framework сырье запрос в LINQ

string upit = "select f.idFilm as idFIlm, f.naziv as nazivFilm, z.naziv as nazivZanr, f.idZanr as idZanr, f.godina as godina, f.slika, f.klip <br> 
from video_klub_sema.film as f <br> 
inner join video_klub_sema.zanr as z on z.idZanr=f.idZanr <br> 
inner join video_klub_sema.kopija as k on f.idFilm=k.idFilm where "; 

if (checkBox1.Checked) 
    upit += "k.nije_tu=0 "; 
else 
    upit += " k.nije_tu in (0,1)"; 

if (comboBoxGodina.SelectedIndex == 0) 
    upit += " and f.godina in (select distinct godina from video_klub_sema.film)"; 
else 
    upit += " and f.godina=" + comboBoxGodina.SelectedItem.ToString(); 

if (comboBoxZanr.SelectedIndex == 0) 
    upit += " and f.idZanr in (select idZanr from video_klub_sema.zanr)"; 
else 
    upit += " and f.idZanr= (select idZanr from video_klub_sema.zanr where naziv = '" + comboBoxZanr.SelectedItem.ToString() + "')"; 

if (textNaziv.Text != "") 
    upit += " and f.naziv like '%" + textNaziv.Text + "%'"; 

upit += " GROUP BY f.naziv, f.idFilm, z.naziv, f.idZanr, f.godina, f.slika, f.klip"; 

Может ли этот запрос будет преобразован в объект-рамочном Linq запрос?

ответ

0

Да, это возможно. Проверьте эти образцы Linq:

http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

оператор IN может быть переведен в метод расширения любого типа.

LIKE может быть переведен в метод расширения Содержит.

Like Operator in Entity Framework?

Не самое лучшее решение, но я надеюсь, что это будет хорошей отправной точкой:

var query = from f in filmTable 
        join z in zanrTable on f.idZanr equals z.idZanr 
        join k in kopijaTable on f.idFilm equals k.idFilm 
        select new 
           { 
            idFIlm=f.idFilm , 
            nazivFilm=f.naziv, 
            nazivZanr=z.naziv, 
            idZanr=f.idZanr, 
            godina=f.godina, 
            f.slika, 
            f.klip, 
            k.nije_tu 
           }; 

     if (checkBox1.Checked) 
      query =query.Where(k=>k.nije_tu==0); 
     else 
      query = query.Where(k => k.nije_tu == 0|| k.nije_tu==1); 

     var godinaSubQuery = filmTable.Select(f => f.godina).Distinct(); 
     if (comboBoxGodina.SelectedIndex == 0) 
      query = query.Where(f => godinaSubQuery.Contains(f.godina)); 
     else 
      query= query.Where(f=>f.godina== comboBoxGodina.SelectedItem.ToString()); 

     if (comboBoxZanr.SelectedIndex == 0) 
      query = query.Where(f => zanrTable.Select(p => p.idZanr).Contains(f.idZanr)); 
     else 
      query =query.Where(f=>f.idZanr==zanrTable.FirstOrDefault(z=>z.naziv== comboBoxZanr.SelectedItem.ToString().idZanr)); 

     if (textNaziv.Text != "") 
      query =query.Where(f=>f.nazivFilm.Contains(textNaziv.Text)); 
+0

Это помогло. Мне пришлось кое-что исправить, но код замечательный. Спасибо. Теперь у меня еще одна проблема. Посмотрите на if (checkBox1.Checked) query = query.Where (k => k.nije_tu == 0); else query = query.Where (k => k.nije_tu == 0 || k.nije_tu == 1) .Distinct(); Например, у меня есть фильм «Золотой глаз», который имеет k.nije_tu both = 1 и = 0, и теперь я получаю этот фильм два раза в списке. Я думаю, что должно быть что-то с Contains, но я не знаю, как это исправить. – filipst

+0

Проблема в том, что я просто догадываюсь, что должен делать ваш запрос. Я предполагаю, что nije_tu является булевым значением, если копия фильма снимается или нет. В этом случае этот код не обязательно еще upit + = "k.nije_tu in (0,1)"; –

+0

Посмотрите на этот вопрос, я думаю, что они имеют дело с одной и той же проблемой. http://stackoverflow.com/questions/16799008/entity-framework-returning-distinct-records-after-join –

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