linq中的switch语句



我使用linq进行sql连接的代码是:

var query1 = from u in dc.Usage_Computers
          where u.DomainUser == s3
          select u; // selects all feilds from table
GridView1.DataSource = query1;
GridView1.DataBind();

我在表"Domainuser"中有一个名为"Operation"的字段,它的值类似于"1,2,3"。当我将这些值填充到数据网格中时,我想将它们转换为有意义的值,比如如果Operation的值为1,则在数据网格中显示为"登录",如果为2,则显示为"注销"等。

从数据库检索后,如何为它们赋值?

这项技术似乎并不特别适用于您的问题,但它仍然适用。

您可以使用C#?在LinqToSql中创建SQL case语句:运算符。

var query1 =
  from u in dc.Usage_Computers
  where u.DomainUser == s3
  select new {usage = u, 
    operation =
      u.DomainUser.Operation == 1 ? "login" :
      u.DomainUser.Operation == 2 ? "logoff" :
      "something else"
  };

在网格视图中使用模板字段:

<asp:GridView ID="gvDomain" runat="server" OnRowDataBound="gvDomain_RowDataBound">
    <Columns>
        <asp:TemplateField>
             <HeaderTemplate>
                 Operation
             </HeaderTemplate>
             <ItemTemplate>
                 <asp:Label id="lblLogon" runat="server" />
             </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

然后使用gridviews RowDataBound事件来发现标签并分配其文本:

Protected Sub gvDomain_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvStates.RowDataBound
    Dim lblLogon As Label = DirectCast(e.Row.FindControl("lblLogon"), Label)
    Dim drv As DataRowView = DirectCast(e.Row.DataItem, DataRowView)
    If lblLogon IsNot Nothing Then
        Select Case drv("Operation").ToString()
            Case "1" 
                lblLogon.Text = "Logon"
                Break
            Case "2"
                lblLogon.Text = "Logoff"
                Break
            //etc...
        End Select
    End If
End Sub
static Func<int?, string> MapSqlIntToArbitraryLabel = (i =>
{
   // for performance, abstract this reference 
   //  dictionary out to a static property
   Dictionary<int, string> labels = new Dictionary<int, string>();
   labels.Add(1, "logon");
   labels.Add(2, "logoff");
   labels.Add(...);
   if (i == null) throw new ArgumentNullException();
   if (i < 1 || i > labels.Count) throw new ArgumentOutOfRangeException();
   return labels.Where(x => x.Key == i.Value)
                .Select(x.Value)
                .Single();
}

该返回语句也可以表示为:

return (from kvp in labels
        where kvp.Key == i.Value
        select kvp.Value).Single();

然后,您可以从linq查询中调用该函数,如下所示:

var query1 = from u in dc.Usage_Computers 
             where u.DomainUser == s3 
             select {
                 Operation = MapSqlIntToArbitraryLabel(u.Operation)
                 // add other properties to this anonymous type as needed
             };

我已经尝试了所有建议的方法来欺骗Linq2Sql运行我的代码,这个方法是我发现的唯一一个允许我作为延迟执行投影的一部分运行代码的方法。

我使用TemplateFields做过类似的事情。使用绑定到属性的ASP:Label,并为控件添加OnPreRender事件处理程序。在控件的事件处理程序中,我根据文本的当前值翻译文本,并设置新值:

protected void label_OnPreRender( object sender, EventArgs e )
{
   Label l = (Label)sender;
   switch (l.Text) {
      case "1":
         l.Text = "Logon";
         break;
       ...
      default:
         break;
   }
}

如果表单处于编辑模式,则需要以不同的方式进行处理。您可能还需要将Inserting和Updating的处理程序添加到视图控件中,以便将页面提供的数据转换为其数据库表示形式。

相关内容

  • 没有找到相关文章

最新更新