2012-07-03 2 views
2

Я работаю над следующимПростого LINQ к SQL вложенной Выберите

var result = 
    from ap in db.Appraisals 
    join at in db.AppraisalTypes 
     on ap.AppraisalType_ID equals at.AppraisalType_ID 
    join w in db.Workers 
     on ap.Worker_ID equals w.Worker_ID 
    where ap.Worker_ID == WorkerID 
      && ap.DateDue != null 
      && ap.DateCompleted == null 
    select new 
    { 
     ap.Worker_ID, 
     ap.Appraisal_ID, 
     at.Description, 
     ap.DateDue, 
     ap.DateCompleted, 
     CompletedBy = from ap2 in db.Appraisals 
         join w2 in db.Workers 
          on ap2.CompletedBy equals w2.Worker_ID 
         select new 
         { 
          name = w2.Surname + ", " + w2.FirstName 
         }         
    }; 

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

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

Хотя компилятор распознает это как синтаксически правильный, на затруднительное мой текст метки свойство имеет следующее ...

System.Collections.Generic.List`1[<>f__AnonymousType9`1[System.String]] 

Я просто смотрю на возможные предостережений я строящих здесь и заполнить огромные пробелы в моем очень ограниченном знании LINQ.

<asp:ListView ID="lvwProbations" runat="server" 
    OnSelectedIndexChanged="lvwProbations_SelectedIndexChanged" 
    OnPagePropertiesChanged="lvwProbations_PagePropertiesChanged" 
    OnPagePropertiesChanging="lvwProbations_PagePropertiesChanging" 
    DataKeyNames="Worker_ID,Appraisal_ID"> 

    <ItemTemplate> 
     <tr class="tableItemStyle" 
      onmouseover="this.style.backgroundColor='Silver'"  
      onmouseout="this.style.backgroundColor='#EAFFFF'"> 

      <td> 
       <asp:Label ID="lblWorkerID" runat="server" 
        Text='<%# Bind("Worker_ID") %>' Visible="false" /> 
      </td> 
      <td> 
       <asp:Label ID="lblProbation" runat="server" Width="200" 
        Text='<%# Bind("Description") %>' /> 
      </td> 
      <td align="center"> 
       <asp:Label ID="lblDateDue" runat="server" Width="100" 
        Text='<%# Bind("DateDue", "{0:d}") %>' /> 
      </td> 
      <td align="center"> 
       <asp:Label ID="lblDateCompleted" runat="server" Width="100" 
        Text='<%# Bind("DateCompleted") %>' /> 
      </td> 
      <td align="center"> 
       <asp:Label ID="lblCompletedBy" runat="server" Width="100" 
        Text='<%# Bind("CompletedBy") %>' /> 
      </td> 
      <td> 
       <asp:ImageButton ID="btnSelect" runat="server" 
        SkinID="selecttimesheet" CommandName="Select" /> 
      </td> 
     </tr> 
    </ItemTemplate> 

    <AlternatingItemTemplate> 
     <tr class="tableAlternatingItemStyle" 
      onmouseover="this.style.backgroundColor='Silver'"   
      onmouseout="this.style.backgroundColor='#CCFFFF'"> 
      <td> 
       <asp:Label ID="lblWorkerID" runat="server" 
         Text='<%# Bind("Worker_ID") %>' Visible="false" /> 
      </td> 
      <td> 
       <asp:Label ID="lblProbation" runat="server" Width="200" 
         Text='<%# Bind("Description") %>' /> 
      </td> 
      <td align="center"> 
       <asp:Label ID="lblDateDue" runat="server" Width="100" 
         Text='<%# Bind("DateDue", "{0:d}") %>' /> 
      </td> 
      <td align="center"> 
       <asp:Label ID="lblDateCompleted" runat="server" Width="100" 
         Text='<%# Bind("DateCompleted") %>' /> 
      </td> 
      <td align="center"> 
       <asp:Label ID="lblCompletedBy" runat="server" Width="100" 
         Text='<%# Bind("CompletedBy") %>' /> 
      </td> 
      <td> 
       <asp:ImageButton ID="btnSelect" runat="server" 
         SkinID="selecttimesheet" CommandName="select" /> 
      </td> 
      </tr> 
     </AlternatingItemTemplate> 

     <EmptyDataTemplate> 
      <table id="Table1" runat="server" style=""> 
      <tr id="Tr2" runat="server" class="tableHoursHeaderStyle"> 
       <th id="Th1" runat="server" style="width:0px;"></th> 
       <th id="Th2" runat="server">Appraisal</th> 
       <th id="Th3" runat="server">Date Due</th> 
       <th id="Th13" runat="server">Date Completed</th> 
       <th id="Th4" runat="server">Completed By</th> 
       <th id="Th6" runat="server" style="width:0px;"></th> 
      </tr> 
      <tr> 
       <td colspan="4"> 
         <p>No Probations available</p> 
       </td> 
      </tr> 
     </table> 
    </EmptyDataTemplate> 

    <LayoutTemplate> 
     <table id="Table2" runat="server"> 
      <tr id="Tr1" runat="server"> 
       <td id="Td1" runat="server"> 
        <table ID="itemPlaceholderContainer" runat="server" 
          border="0" class="TimeSheet_Table" style=""> 
        <tr id="Tr2" runat="server" 
         class="tableHoursHeaderStyle"> 
          <th id="Th1" runat="server" style="width:0px;"></th> 
          <th id="Th2" runat="server">Appraisal</th> 
          <th id="Th3" runat="server">Date Due</th> 
          <th id="Th13" runat="server">Date Completed</th> 
          <th id="Th5" runat="server">Completed By</th> 
          <th id="Th7" runat="server" style="width:0px;"></th> 
        </tr> 
        <tr ID="itemPlaceholder" runat="server"></tr> 
        </table> 
       </td> 
       </tr> 
      </table> 
     </LayoutTemplate> 
</asp:ListView> 

Edited показать разметки/привязки по запросу

+0

Не уверен, что вопрос, можете ли вы быть более ясным? – Maghis

+0

Извинения, в основном вложенный выбор связывает фрагмент кода System.Collections, как указано выше. Мне нужно получить имя менеджера линий, зная, что в каждом случае самая последняя оценка для конкретного сотрудника будет иметь нулевой возврат для поля CompletedBy. Что означает фрагмент кода, что я не понимаю о своей попытке вернуть записи/столбцы данных? – dotnetnewb

+0

Позвольте мне увидеть вашу привязку ярлыка. – WinnerIT

ответ

2

Вашего CompletedBy поля фактически напечатали в виде набора класса, который имеет одно поле строки. Потому что вы используете select new { name = ... } вы фактически создаете класс, который выглядит следующим образом, который не то, что вы хотите на все:

class Anonymous9 
{ 
    public name { get; set; } 
} 

И, кроме того, вы создаете IEnumerable<Anonymous9>, который является сбор этих объектов.

Вместо этого вам просто нужна одна строка. Для того, чтобы получить его, чтобы быть только одна строка, избавиться от new {} и обернуть его FirstOrDefault():

CompletedBy = (from ap2 in db.Appraisals 
        join w2 in db.Workers 
         on ap2.CompletedBy equals w2.Worker_ID 
        select w2.Surname + ", " + w2.FirstName 
       ).FirstOrDefault() 
+0

+1 w/Отвечено принято :) Большое спасибо. Мне нужно много понимать о некоторых базовых концепциях, которые я знаю об этом. – dotnetnewb

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