更新
我基本上将查询绑定到WinForms DataGridView
。我希望列标题合适,并在需要时包含空格。例如,我希望列标题为First Name
而不是FirstName
。
如何在LINQ中创建自己的自定义列名?
例如:
Dim query = From u In db.Users _
Select u.FirstName AS 'First Name'
答案 0 :(得分:26)
如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
};
将FirstName重命名为First,LastName重命名为Last。
答案 1 :(得分:14)
如果要更改标题文本,可以在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();
}
答案 2 :(得分:12)
我解决了自己的问题,但你的所有答案都非常有用,并指出了我正确的方向。
在我的LINQ
查询中,如果列名有多个单词,我会用下划线分隔单词:
Dim query = From u In Users _
Select First_Name = u.FirstName
然后,在Paint
的{{1}}方法中,我用空格替换了标题中的所有下划线:
DataGridView
答案 3 :(得分:6)
您还可以添加一个事件处理程序来替换这些下划线!
对于那些喜欢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('_', ' ');
}
}
答案 4 :(得分:4)
我会用:
var query = from u in db.Users
select new
{
FirstName = u.FirstName,
LastName = u.LastName,
FullName = u.FirstName + " " + u.LastName
};
(来自Scott Nichols)
以及一个读取Camel Case字符串并在每个新资本之前插入空格的函数(您可以为ID等添加规则)。我现在暂时没有这个函数的代码,但写起来相当简单。
答案 5 :(得分:3)
您可以在列名中使结果具有下划线,并在TemplateField中使用HeaderTemplate将空格替换为下划线。或者为GridView子类化DataControlField并覆盖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>
答案 6 :(得分:2)
我不明白为什么你必须这样做,如果你想为网格做某事,为什么不在HTML中命名标题?
答案 7 :(得分:2)
您实际要做的是设置对返回的变量引用,没有办法用空格命名变量。您是否有最终结果,或许如果我们知道最终目标,我们可以帮助您找到适合的解决方案。
答案 8 :(得分:2)
使用Linq扩展方法:
SomeDataSource.Select(i => new { NewColumnName = i.OldColumnName, NewColumnTwoName = i.OldColumnTwoName});
答案 9 :(得分:1)
正如其他人已经指出的那样,如果标题标题等在设计时已知,请关闭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; }
}
}
答案 10 :(得分:0)
我相信这可以使用显式名称类型
来实现 system.Name,
sysentity.Name
//change this to
entity = sysentity.Name
答案 11 :(得分:-1)
您可以使用'let'关键字:
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 };
答案 12 :(得分:-6)
我的VS2008现在被破坏了,所以我无法检查。在C#中,您将使用“=” - 如何
Dim query = From u In db.Users _
Select 'First Name' = u.FirstName