Ошибка использования QueryExtender с EntityDataSource - «FirstName» не является членом типа «System.Data.Common.DbDatRecord» - PullRequest
0 голосов
/ 22 сентября 2011

Следующий GridView с EntityDataSource, который захватывает 3 поля из таблицы Surveyors (которая содержит больше полей), работает, но, конечно, он показывает мне каждого Surveyor.

<asp:GridView ID="gvwSurveyors" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellPadding="3" DataSourceID="edsSurveyors">
  <Columns>
    <asp:BoundField DataField="FirstName" HeaderText="FirstName" ReadOnly="True" SortExpression="FirstName" />
    <asp:BoundField DataField="LastName" HeaderText="LastName" ReadOnly="True" SortExpression="LastName" />
    <asp:BoundField DataField="ID" HeaderText="ID" ReadOnly="True" SortExpression="ID" />
  </Columns>
</asp:GridView>
<asp:EntityDataSource ID="edsSurveyors" runat="server"
  ConnectionString="name=PLSOEntities"
  DefaultContainerName="PLSOEntities"
  EnableFlattening="False"
  EntitySetName="Surveyors"
  Select="it.[FirstName], it.[LastName], it.[ID]"
  AutoGenerateOrderByClause="true">
  <OrderByParameters>
    <asp:Parameter DefaultValue="LastName" />
  </OrderByParameters>
</asp:EntityDataSource>

Таким образом, чтобы начальная загрузка страницы не показывала все, я добавил событие OnSelecting в EntityDataSource и отменил запрос, если это не обратная передача.

protected void edsSurveyors_Selecting(object sender, EntityDataSourceSelectingEventArgs e) {
  if (!Page.IsPostBack)
    e.Cancel = true;
}

У меня есть два текстовых поля с именами txtFirstName и txtLastName, которые я хочу, чтобы пользователь мог выполнять поиск, используя стиль SQL-запроса LIKE. Некоторое чтение в Интернете указало мне на QueryExtender. Я изменил код на следующее:

<asp:GridView ID="gvwSurveyors" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellPadding="3" DataSourceID="edsSurveyors">
  <Columns>
    <asp:BoundField DataField="FirstName" HeaderText="FirstName" ReadOnly="True" SortExpression="FirstName" />
      <asp:BoundField DataField="LastName" HeaderText="LastName" ReadOnly="True" SortExpression="LastName" />
      <asp:BoundField DataField="ID" HeaderText="ID" ReadOnly="True" SortExpression="ID" />
    </Columns>
  </asp:GridView>
  <asp:EntityDataSource ID="edsSurveyors" runat="server"
    ConnectionString="name=PLSOEntities"
    DefaultContainerName="PLSOEntities"
    EnableFlattening="False"
    EntitySetName="Surveyors"
    Select="it.[FirstName], it.[LastName], it.[ID]"
    AutoGenerateOrderByClause="true" onselecting="edsSurveyors_Selecting">
    <OrderByParameters>
      <asp:Parameter DefaultValue="LastName" />
    </OrderByParameters>
  </asp:EntityDataSource>
  <asp:QueryExtender ID="qexSurveyor" runat="server" TargetControlID="edsSurveyors">
    <asp:SearchExpression SearchType="Contains" DataFields="FirstName">
      <asp:ControlParameter ControlID="txtFirstName" />
    </asp:SearchExpression>
  </asp:QueryExtender>

Так что теперь, когда я нажимаю кнопку, я получаю сообщение об ошибке: «FirstName» не является членом типа «System.Data.Common.DbDataRecord»

Что я могу сделать, чтобы разрешить содержание? Как только это сработает, я добавлю параметр LastName, который делает то же самое.

Ответы [ 2 ]

1 голос
/ 10 января 2012

Я также столкнулся с тем же при использовании AdventureWorks в качестве источника данных.Мне пришлось удалить «Select =» из моего EntityDataSource.В качестве обходного пути я пошел в свой GridView и установил AutoGenerateColumns = "False".Затем я вручную добавил каждый столбец, который хотел отобразить в Gridview, например,

        <asp:BoundField DataField="CustomerID" HeaderText="Customer ID" />
        <asp:BoundField DataField="SalesPerson" HeaderText="Sales Person" />
        <asp:BoundField DataField="CustomerID" HeaderText="Customer ID" />
        <asp:BoundField DataField="FirstName" HeaderText="First Name" />
        <asp:BoundField DataField="LastName" HeaderText="Last Name" />
        <asp:BoundField DataField="CompanyName" HeaderText="Company Name" />
        <asp:BoundField DataField="EmailAddress" HeaderText="Email Address" />
        <asp:BoundField DataField="Phone" HeaderText="Phone" />

В качестве дополнительного примечания, кажется, что еще один обходной путь, хотя и программно, заключается в применении запроса LINQ к EntityDataSource с использованием события onquerycreated,В этом случае вам не нужно декларативно использовать Query Extender.Полная статья здесь -> http://msdn.microsoft.com/en-us/library/ee404748.aspx

0 голосов
/ 23 сентября 2011

В настоящее время я сталкиваюсь с той же проблемой, я обнаружил, что если я удаляю «Select =» из EntityDataSource, он работает. По-видимому, вы вынуждены выбрать все, когда используете QueryExtender. Однако я не хочу возвращать каждое поле в таблице, и я еще не нашел способ обойти это.

Итак, у кого-нибудь есть обходной путь?

...