2011-11-19 78 views
1

我使用LINQ to Entities数据绑定:LINQ到实体无法识别方法 'System.String的ToString()' 方法

我的GridView如下:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" AllowPaging="True" 
    EmptyDataText="No Data" CellPadding="3" CellSpacing="1" 
    AllowSorting="True" OnPageIndexChanging="GridView1_PageIndexChanging" OnRowCancelingEdit="GridView1_RowCancelingEdit" 
    OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating" CssClass="gridview" 
    OnSorting="GridView1_Sorting" HorizontalAlign="Center"> 
    <AlternatingRowStyle BackColor="#F0F0F0" /> 
    <Columns> 
     <asp:BoundField HeaderText="ID" DataField="ID" ReadOnly="True" SortExpression="ID" /> 
     <asp:BoundField HeaderText="Name" DataField="SoftwareName" SortExpression="Name" /> 
     <asp:BoundField HeaderText="Key" DataField="Key" SortExpression="Key" /> 
     <asp:BoundField HeaderText="Date" DataField="Date" ItemStyle-CssClass="date_td" SortExpression="Date" 
      ReadOnly="True"> 
      <ItemStyle CssClass="date_td"></ItemStyle> 
     </asp:BoundField> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:ImageButton runat="server" ToolTip="edit" ID="EditButton" CommandName="Edit" 
        ImageUrl="~/images/edit.png" /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:ImageButton runat="server" ID="UpdateButton" ToolTip="Submit" CommandName="Update" 
        ImageUrl="~/images/ok.gif" /> 
       <asp:ImageButton runat="server" ID="Cancel" ToolTip="Submit" CommandName="Cancel" 
        ImageUrl="~/images/cancel.gif" /> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:ImageButton runat="server" ToolTip="Delete" ID="btnDelete" CommandName="cDelete" 
        ImageUrl="~/images/delete.png" OnCommand="OnDelete" CommandArgument='<%# Bind("id") %>' 
        OnClientClick="return confirm('Are you sure ?')" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
    <PagerSettings Mode="NumericFirstLast" /> 
</asp:GridView> 

我填在GridView用下面的C#代码:

private IQueryable SortGridView() 
{ 
    IQueryable<Softwares> softwares = Search(); 

    if (softwares == null) return null; 

    string sortExpression = (ViewState["SortExpression"] as string) == null 
           ? "ID" 
           : ViewState["SortExpression"] as string; 
    string lastDirection = (ViewState["SortDirection"] as string) == null 
           ? "ASC" 
           : ViewState["SortDirection"] as string; 

    switch (sortExpression) 
    { 
     case "ID": 
      softwares = (lastDirection == "ASC") 
           ? softwares.OrderBy(q => q.id) 
           : softwares.OrderByDescending(q => q.id); 
      break; 

     case "Name": 
      softwares = lastDirection == "ASC" 
          ? softwares.OrderBy(q => q.softwareName) 
          : softwares.OrderByDescending(q => q.softwareName); 
      break; 

     case "Key": 
      softwares = (lastDirection == "ASC") 
          ? softwares.OrderBy(q => q.Keys.Key) 
          : softwares.OrderByDescending(q => q.Keys.Key); 
      break; 

     case "Date": 
      softwares = lastDirection == "ASC" 
          ? softwares.OrderBy(q => q.Date) 
          : softwares.OrderByDescending(q => q.Date); 
      break; 
    } 

    return from q in softwares 
      select new 
         { 
          ID = q.id, 
          SoftwareName = q.softwareName, 
          Key = q.Keys.Key 
          Date = q.Date.ToString() 
         }; 
} 

protected void ButtonSearch_Click(object sender, EventArgs e) 
{ 
    GridView1.DataSource = SortGridView(); 
    GridView1.DataBind();// <<--- Exception 
} 

ButtonSearch_Click我得到以下异常:

LINQ到实体无法识别方法“System.String的ToString()”方法,而这种方法不能被翻译成店表达

我受够了没有LINQ到SQL之前完成它任何问题,这里有什么问题?

回答

1

LINQ to Entities查询被内部转换为sql语句。就你的情况而言,LINQ to Entity provider无法将“toString”调用映射到合适的SQL语句中。你可从LINQ的数据实体,然后枚举下线并进行必要的修改,即:

var data = (from q in softwares 
      select new 
         { 
          ID = q.id, 
          SoftwareName = q.softwareName, 
          Key = q.Keys.Key 
          Date = q.Date 
         }).ToList(); 

,然后通过调用ToString()方法离线转换的日期部分。

data.ForEach(item => item.Date = item.Date.ToString()); 

您正在从您的方法返回匿名类型。匿名类型只能在定义它们的类中访问。你可以尝试像下面的代码,我已经给:

private IList<SoftwareInfo> SortGridView() 
{ 
    // regular code 

    return (from q in softwares 
      select new SoftwareInfo 
         { 
          ID = q.id, 
          SoftwareName = q.softwareName, 
          Key = q.Keys.Key, 
          Date = q.Date 
         }).ToList(); 
} 


public class SoftwareInfo 
{ 
    public int ID {get;set;} 
    public string SoftwareName {get;set;} 
    public string Key {get;set;} 
    public DateTime Date {get;set;} 
} 

protected void ButtonSearch_Click(object sender, EventArgs e) 
{ 
    GridView1.DataSource = SortGridView(); 
    GridView1.DataBind();// <<--- Exception 
} 
+0

感谢,但在'ForEach'线,当我想分配给item.Date.ToString item.Data,发生这样的错误:'属性或索引'AnonymousType#1.Date'不能被分配给 - 它是只读的' –

+0

此外,还有另一个错误:'错误不能隐式地将类型'字符串'转换为'System.DateTime'' –

+0

那么我看到问题。您从“SortGridView”方法返回一个匿名类型。匿名类型范围仅限于定义它们的类中。您可以通过使用C#的“动态”功能或通过定义具体类来解决此问题。 –

相关问题