LINQ: имена пользовательских столбцов

UPDATE

Я в основном привязываю запрос к WinForms DataGridView. Я хочу, чтобы заголовки столбцов были подходящими и имели места, когда это необходимо. Например, я хотел бы, чтобы заголовок столбца был First Name вместо FirstName.


Как вы создаете собственные имена столбцов в LINQ?

Например:

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

Ответы

Ответ 1

Я решил свою проблему, но все ваши ответы были очень полезными и указали мне в правильном направлении.

В моем запросе 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

Ответ 2

В качестве состояний 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.

Ответ 3

Если вы хотите изменить текст заголовка, вы можете установить это в определении 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();
}

Ответ 4

Вы также можете добавить обработчик событий, чтобы заменить эти символы подчеркивания для вас!

Для тех из вас, кто любит С#:

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('_', ' ');
    }

}

Ответ 5

Я бы использовал:

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

(от Скотта Николса)

вместе с функцией, которая читает строку Camel Case и вставляет пробелы перед каждой новой столицей (вы можете добавить правила для ID и т.д.). На данный момент у меня нет кода для этой функции, но его довольно просто написать.

Ответ 6

Вы можете сделать, чтобы ваши результаты подчеркивали имя столбца и использовали шаблон заголовка в 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>

Ответ 7

Я не понимаю, зачем вам это нужно, если вы пытаетесь сделать это для сетки или чего-то еще, почему бы просто не назвать заголовок в HTML?

Ответ 8

То, что вы на самом деле делаете, это установить ссылку на переменную return, не существует способа назвать переменную пробелом. Есть ли причина, по которой вы это делаете, возможно, если бы мы знали конечную цель, мы могли бы помочь вам придумать подходящее решение.

Ответ 9

Использование метода расширения Linq:

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

Ответ 10

Как уже отмечалось, если заголовок заголовка и т.д. известен во время разработки, отключите AutoGeneratedColumns и просто установите заголовок и т.д. в определении поля вместо использования автоматически сгенерированных столбцов. Из вашего примера видно, что запрос является статическим и что названия известны во время разработки, поэтому, вероятно, ваш лучший выбор.

Однако [хотя ваш вопрос не указывает этого требования] - если текст заголовка (и форматирование и т.д.) неизвестен во время разработки, но будет определен во время выполнения, и если вам нужно автоматически генерировать столбцы (используя AutoGenerateColumns = true ") для этого есть обходные пути.

Один из способов сделать это - создать новый класс управления, который наследует 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; }
    }
}

Ответ 11

Вы можете использовать ключевое слово '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

Мой VS2008 сейчас заблокирован, поэтому я не могу проверить. В С# вы должны использовать "=" - "Как насчет

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