linq中的switch语句

时间:2008-10-16 19:28:52

标签: asp.net linq

我使用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,则在datagrid中显示为“logon”,如果为2,则“logoff”等...

如何从数据库中检索后为它们分配值?

4 个答案:

答案 0 :(得分:13)

这种技术似乎并不特别适用于您的问题,但无论如何都是这样。

您可以使用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"
  };

答案 1 :(得分:2)

在gridview中使用模板字段:

<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

答案 2 :(得分:1)

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来运行我的代码,这个方法是我发现的唯一允许我运行代码作为延迟执行投影的一部分。

答案 3 :(得分:0)

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

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

如果表单处于编辑模式,则需要以不同方式处理它。您还可能需要将用于插入和更新的处理程序添加到用于将页面提供的数据转换为其数据库表示形式的View控件。