LINQ:自定义列名(LINQ: custom column names)

2019-08-01 08:39发布

UPDATE

我基本上绑定查询一个WinForms DataGridView 。 我想列标题是适当的,并在需要时有空格。 例如,我想列标题是First Name而不是FirstName


你如何创建LINQ自己的自定义列名?

例如:

Dim query = From u In db.Users _
            Select u.FirstName AS 'First Name'

Answer 1:

作为CQ指出,你不能有字段名称空间,但是,您可以返回新列。

var query = from u in db.Users
            select new
            {
                FirstName = u.FirstName,
                LastName = u.LastName,
                FullName = u.FirstName + " " + u.LastName
            };

然后,你可以从上面或循环通过其绑定到变量查询任何....

foreach (var u in query)
{
   // Full name will be available now 
   Debug.Print(u.FullName); 
}

如果你想重命名列,你可以,但空间不会被允许。

var query = from u in db.Users
            select new
            {
                First = u.FirstName,
                Last = u.LastName
            };

将重命名为姓,以第一次和姓氏为最后一个。



Answer 2:

如果你想改变标题,您可以设置在GridView的定义...

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="FirstName" HeaderText="First Name" />
    </Columns>
</asp:GridView>

在后面的代码就可以绑定到用户,这将设置标头名。

protected void Page_Load(object sender, EventArgs e)
{
     // initialize db datacontext
     var query = from u in db.Users
                 select u;
     GridView1.DataSource = query;
     GridView1.DataBind();
}


Answer 3:

我解决我自己的问题,但所有的答案都非常有帮助,并指出我在正确的方向。

在我的LINQ查询,如果列名有超过一个的话,我会用下划线区分开来的话:

Dim query = From u In Users _
            Select First_Name = u.FirstName

然后,将内Paint的方法DataGridView ,我替换为空间中的报头内的所有下划线:

Private Sub DataGridView1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles DataGridView1.Paint
    For Each c As DataGridViewColumn In DataGridView1.Columns
        c.HeaderText = c.HeaderText.Replace("_", " ")
    Next
End Sub


Answer 4:

您还可以添加一个事件处理程序,以取代那些下划线为您服务!

对于那些你们谁爱C#:

datagrid1.ItemDataBound += 
    new DataGridItemEventHandler(datagrid1_HeaderItemDataBound);

和您的处理程序应该是这样的:

private void datagrid1_HeaderItemDataBound(object sender, DataGridItemEventArgs e)
{

    if (e.Item.ItemType == ListItemType.Header)
    {
        foreach(TableCell cell in e.Item.Cells)
            cell.Text = cell.Text.Replace('_', ' ');
    }

}


Answer 5:

我会用:

var query = from u in db.Users
            select new
            {
                FirstName = u.FirstName,
                LastName = u.LastName,
                FullName = u.FirstName + " " + u.LastName
            };

(从斯科特尼科尔斯)

与读取骆驼案例字符串,每一个新的资本之前插入空格的函数一起(你可以添加的ID等规则)。 我没有与我该功能的代码了,但它相当简单写。



Answer 6:

你可以让你的结果有下划线的列名,并使用HeaderTemplate中的一个TemplateField用空格来代替下划线。 或子类的DataControlField为GridView和覆盖HeaderText属性:

namespace MyControls 
{
public SpacedHeaderTextField : System.Web.UI.WebControls.BoundField
 { public override string HeaderText
    { get 
       { string value = base.HeaderText;
         return (value.Length > 0) ? value : DataField.Replace(" ","");
       }
      set
       { base.HeaderText = value;
       }     
    }
 } 
 }

ASPX:

<%@Register TagPrefix="my" Namespace="MyControls" %>

<asp:GridView DataSourceID="LinqDataSource1" runat='server'>
  <Columns>
     <my:SpacedHeaderTextField DataField="First_Name" />
  </Columns>
</asp:GridView>


Answer 7:

我不明白为什么你就必须做到这一点,如果你正在尝试做的,对于一个网格或东西,为什么不只是名称的HTML头?



Answer 8:

什么你实际上做的是设置一个变量引用到返回,没有办法与命名空间的变量。 是否有一个最终的结果原因你这样做,也许如果我们知道最终的目标,我们可以帮你想出一个适合的解决方案。



Answer 9:

使用LINQ扩展方法:

SomeDataSource.Select(i => new { NewColumnName = i.OldColumnName, NewColumnTwoName = i.OldColumnTwoName});


Answer 10:

正如其他人已经指出,如果头题等在设计时已知,关闭AutoGeneratedColumns和刚刚成立的字段定义,而不是使用自动生成的列标题等。 从你的例子看来,查询是静态的,而且标题是在设计时已知的,因此这可能是你最好的选择。

但是[,虽然你的问题没有指定这个要求- 如果头文字(和格式等) 没有在设计时已知,但会在运行时确定,如果你需要自动生成列(使用的AutoGenerateColumns =真正的“)存在对于该解决方法。

要做到这一点的方法之一是创建一个继承GridView的一个新的控件类。 然后您可以设置标题,通过重写GridView的“CreateAutoGeneratedColumn”格式化自动生成的字段等。 例:

//gridview with more formatting options
namespace GridViewCF
{
    [ToolboxData("<{0}:GridViewCF runat=server></{0}:GridViewCF>")]
    public class GridViewCF : GridView
    {
        //public Dictionary<string, UserReportField> _fieldProperties = null;

        public GridViewCF()
        {
        }

        public List<FieldProperties> FieldProperties
        {
            get
            {
                return (List<FieldProperties>)ViewState["FieldProperties"];
            }
            set
            {
                ViewState["FieldProperties"] = value;
            }
        }

        protected override AutoGeneratedField CreateAutoGeneratedColumn(AutoGeneratedFieldProperties fieldProperties)
        {
            AutoGeneratedField field = base.CreateAutoGeneratedColumn(fieldProperties);
            StateBag sb = (StateBag)field.GetType()
                .InvokeMember("ViewState",
                BindingFlags.GetProperty |
                BindingFlags.NonPublic |
                BindingFlags.Instance,
                null, field, new object[] {});

            if (FieldProperties != null)
            {
                FieldProperties fps = FieldProperties.Where(fp => fp.Name == fieldProperties.Name).Single();
                if (fps.FormatString != null && fps.FormatString != "")
                {
                    //formatting
                    sb["DataFormatString"] = "{0:" + fps.FormatString + "}";
                    field.HtmlEncode = false;
                }

                //header caption
                field.HeaderText = fps.HeaderText;

                //alignment
                field.ItemStyle.HorizontalAlign = fps.HorizontalAlign;
            }

            return field;
       }
    }

    [Serializable()]
    public class FieldProperties
    {
        public FieldProperties()
        { }

        public FieldProperties(string name, string formatString, string headerText, HorizontalAlign horizontalAlign)
        {
            Name = name;
            FormatString = formatString;
            HeaderText = headerText;
            HorizontalAlign = horizontalAlign;
        }

        public string Name { get; set; }
        public string FormatString { get; set; }
        public string HeaderText { get; set; }
        public HorizontalAlign HorizontalAlign { get; set; }
    }
}


Answer 11:

我相信这可以实现使用明确的名称类型

 system.Name,
 sysentity.Name 
 //change this to 
 entity = sysentity.Name


Answer 12:

您可以使用“让”关键字:

Dim query = From u In db.Users _
            let First_Name = u.FirstName
            Select First_Name

至于其他的答案在这里已经表明,这是没有用的。 然而,let关键字是做更复杂的查询有用的(这个例子是把我的头顶部,不需要let关键字工作):

from x in dc.Users 
let match = regex.Match(".*ass.*", x.Name) 
let comment = match ? "*snicker*" : "sup"
select new { Name = x.Name, Comment = comment };


Answer 13:

现在我的VS2008被捣毁,所以我无法检查。 在C#中,你可以使用“=” - 怎么样

Dim query = From u In db.Users _
            Select 'First Name' = u.FirstName


文章来源: LINQ: custom column names