2016-11-16 2 views
0

Ищите помощь по выражению лямбда LINQ. Мне нужно выбрать данные из двух объединенных таблиц. SQL-запрос, как это:Ищите помощь по выражению лямбда LINQ

declare @formName 

select T1.Title, T1.Text, T2.Name, T1.Active, T1.ConfirmationText, T1.URL 
From T1 join T2 on T2.FormCodeID = T1.FormCodeID 
Where T1.Active =1 and T2.Name = @formName 

С моей ситуации, я должен использовать лямбда-выражения LINQ, но получил ошибку с кодом:

public IEnumerable<UModel.Form> GetForms(string formName) 
    { 
     IEnumerable<UModel.Form> form = null; 

     using (var context = new UASContext()) 
     { 
      form = context.Forms.Join(context.FormCode, f => f.FormCodeID, fc => fc.FormCodeID, 
       (f, fc) => new { Active = f.Active, FormName = fc.FormName}) 
       .Where(f => (f.Active == true)) 
       .Where (fc => (fc.FormName ==formName)).ToList(); 
     } 

     return form; 
} 

Любая помощь или предложения будут высоко оценены.

+2

Мы не собираемся делать работу компилятор уже сделал. Отправьте сообщение об ошибке. Объясните, что вы не понимаете. Опубликуйте то, что вы пытались исправить. – nvoigt

ответ

0

Ваш LINQ выглядит нормально. Но вы, кажется, ожидаете, что он приведет к списку объектов Form. Ваш оператор SQL не возвращает набор записей T1, ваш LINQ не делает ни того, ни другого.

Ваш код выглядит хорошо, ваше ожидание неверно. Мы не можем это исправить. Ваш SELECT не возвращает строки T1, которые LINQ не вернет Forms.

Если вы хотите сделать, что вы должны помнить форму при присоединении:

form = context.Forms.Join(context.FormCode, f => f.FormCodeID, fc => fc.FormCodeID, 
      (f, fc) => new { Form = f, Active = f.Active, FormName = fc.FormName}) 
      .Where(temp => (temp.Active && temp.FormName == formName)) 
      .Select(temp => temp.Form).ToList(); 

Но это не эквивалент вашего SQL.

+0

Благодарим за помощь. – SCD

1

Вы можете попробовать

form = context.Forms.Join(context.FormCode, f => f.FormCodeID, fc => fc.FormCodeID, 
       (f, fc) => new { Active = f.Active, FormName = fc.FormName}) 
       .Where(f => f.Active == true && f.FormName==formName).ToList(); 

Update

form = context.Forms.Join(context.FormCode, f => f.FormCodeID, fc => fc.FormCodeID, 
        (f, fc) => new { Form = f, FormCode= fc}) 
        .Where(f => f.Form.Active == true && f.FormCode.FormName==formName) 
        .Select(x=>x.Form) 
        .ToList(); 
+0

Что именно это исправить? – nvoigt

+0

@ Eldeniz, Это работает после удаления f.FormCode.FormName == formName из предложения where. Я изменил таблицу, поэтому здесь не нужно передавать имя formName. Большое спасибо! – SCD

+0

Добро пожаловать – Eldeniz

0

Я рекомендую запрос Linq, в некоторых случаях это более ясно:

public IEnumerable<UModel.Form> GetForms(string formName) 
{ 
    using (var context = new UASContext()) 
    { 
     var query = from form in context.Forms 
      join formCode in context.FormCode on form.FormCodeID equals formCode.FormCodeID 
      where form.Active == true and formCode.FormName == formName 
      select form; 

     return query.ToList(); 
    } 
} 
0

Проблема заключается в том, что вы возвращаете IEnumerable<UModel.Form> из метода и выбирая new { Active = f.Active, FormName = fc.FormName}, т. Е. Анонимный объект. Вы должны выбрать и вернуть коллекцию объекта Form.

Вы можете изменить свой запрос, чтобы выбрать форму, как показано ниже:

form = context.Forms.Join(context.FormCode, f => f.FormCodeID, fc => fc.FormCodeID, (f, fc) => new { Form = f, FormName = fc.FormName }).Where(x => (x.Form.Active && x.FormName == formName)).Select(x => x.Form); 
+0

спасибо. этот код тоже помогает. – SCD

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