Mapping a query column to property with the different name in LINQ. ColumnAttribute.Name does not work












0















I have a query that retrieves three columns from a table - ID, EMAIL_ID_NUMBER, and MESSAGE_SUBJECT. I want to map these three columns to the properties of an object ID, EMAIL_ID_NUMBER and MessageSubject (The names are chosen to highlight the issue). The problem is that the mapping does not work as I expect.



I expect that when I specify Column(Name = "COLUMN1") next to some property, then the value of the COLUMN1 will be stored into this property. However, it does not work. The value is stored only when the property name is exactly the same as the column name. For example in this case...



[Column(Name = "MESSAGE_SUBJECT")]
public String MessageSubject;


... I expect that the MESSAGE_SUBJECT column from the query will populate the MessageSubject property. However, it is not happening. The question is how can I do this?



Other properties are populated without issues as their names are the same as the names of the columns in the query.



The code is below



using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.Text;
using System.Threading.Tasks;

namespace LinqExample1
{

class Record1
{
[Column(CanBeNull = false, IsPrimaryKey = true)]
public int ID;

[Column()]
public String EMAIL_ID_NUMBER;

[Column(Name = "MESSAGE_SUBJECT")]
public String MessageSubject;

public override string ToString()
{
return $"{base.ToString()}. ID={ID}. Name={EMAIL_ID_NUMBER}. MessageSubject={MessageSubject}";
}
}

class Program
{
static void Main(string args)
{
var context = new DataContext(System.Configuration.ConfigurationManager.ConnectionStrings["LinqExample1.Properties.Settings.MyConnectionString"].ToString());
var emailTemplates = context.ExecuteQuery<Record1>("select ID, EMAIL_ID_NUMBER, MESSAGE_SUBJECT from EMAIL_NOTIFICATIONS");
foreach (Record1 emailTemplate in emailTemplates)
{
Console.WriteLine(emailTemplate.ToString());
}
}
}
}


The output that I get looks like below:



LinqExample1.Record1. ID=4. Name=EM 05. MessageSubject=
LinqExample1.Record1. ID=16. Name=EM 06. MessageSubject=
LinqExample1.Record1. ID=17. Name=EM 07. MessageSubject=


E.g. MessageSubject is always empty even if the underlying query returns data for the MESSAGE_SUBJECT column.



There is a couple of potential solutions which I don't like.




  1. Make property names same as column names. E.g. the Record1 class
    will have properties ID, EMAIL_ID_NUMBER, and MESSAGE_SUBJECT.

  2. Use column aliases in the query to match property names. E.g. use query
    "select ID, EMAIL_ID_NUMBER Name, MESSAGE_SUBJECT MessageSubject
    from EMAIL_NOTIFICATIONS" and the Record1 property names ID, Name,
    and MessageSubject.










share|improve this question

























  • Change your property to MESSAGE_SUBJECT

    – Ryan Wilson
    Nov 21 '18 at 15:19













  • Thanks for the reply, but this is not what I want. I want the property names to adhere to the C# naming guidelines, not to what is declared in the database.

    – Andrew
    Nov 21 '18 at 15:26
















0















I have a query that retrieves three columns from a table - ID, EMAIL_ID_NUMBER, and MESSAGE_SUBJECT. I want to map these three columns to the properties of an object ID, EMAIL_ID_NUMBER and MessageSubject (The names are chosen to highlight the issue). The problem is that the mapping does not work as I expect.



I expect that when I specify Column(Name = "COLUMN1") next to some property, then the value of the COLUMN1 will be stored into this property. However, it does not work. The value is stored only when the property name is exactly the same as the column name. For example in this case...



[Column(Name = "MESSAGE_SUBJECT")]
public String MessageSubject;


... I expect that the MESSAGE_SUBJECT column from the query will populate the MessageSubject property. However, it is not happening. The question is how can I do this?



Other properties are populated without issues as their names are the same as the names of the columns in the query.



The code is below



using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.Text;
using System.Threading.Tasks;

namespace LinqExample1
{

class Record1
{
[Column(CanBeNull = false, IsPrimaryKey = true)]
public int ID;

[Column()]
public String EMAIL_ID_NUMBER;

[Column(Name = "MESSAGE_SUBJECT")]
public String MessageSubject;

public override string ToString()
{
return $"{base.ToString()}. ID={ID}. Name={EMAIL_ID_NUMBER}. MessageSubject={MessageSubject}";
}
}

class Program
{
static void Main(string args)
{
var context = new DataContext(System.Configuration.ConfigurationManager.ConnectionStrings["LinqExample1.Properties.Settings.MyConnectionString"].ToString());
var emailTemplates = context.ExecuteQuery<Record1>("select ID, EMAIL_ID_NUMBER, MESSAGE_SUBJECT from EMAIL_NOTIFICATIONS");
foreach (Record1 emailTemplate in emailTemplates)
{
Console.WriteLine(emailTemplate.ToString());
}
}
}
}


The output that I get looks like below:



LinqExample1.Record1. ID=4. Name=EM 05. MessageSubject=
LinqExample1.Record1. ID=16. Name=EM 06. MessageSubject=
LinqExample1.Record1. ID=17. Name=EM 07. MessageSubject=


E.g. MessageSubject is always empty even if the underlying query returns data for the MESSAGE_SUBJECT column.



There is a couple of potential solutions which I don't like.




  1. Make property names same as column names. E.g. the Record1 class
    will have properties ID, EMAIL_ID_NUMBER, and MESSAGE_SUBJECT.

  2. Use column aliases in the query to match property names. E.g. use query
    "select ID, EMAIL_ID_NUMBER Name, MESSAGE_SUBJECT MessageSubject
    from EMAIL_NOTIFICATIONS" and the Record1 property names ID, Name,
    and MessageSubject.










share|improve this question

























  • Change your property to MESSAGE_SUBJECT

    – Ryan Wilson
    Nov 21 '18 at 15:19













  • Thanks for the reply, but this is not what I want. I want the property names to adhere to the C# naming guidelines, not to what is declared in the database.

    – Andrew
    Nov 21 '18 at 15:26














0












0








0








I have a query that retrieves three columns from a table - ID, EMAIL_ID_NUMBER, and MESSAGE_SUBJECT. I want to map these three columns to the properties of an object ID, EMAIL_ID_NUMBER and MessageSubject (The names are chosen to highlight the issue). The problem is that the mapping does not work as I expect.



I expect that when I specify Column(Name = "COLUMN1") next to some property, then the value of the COLUMN1 will be stored into this property. However, it does not work. The value is stored only when the property name is exactly the same as the column name. For example in this case...



[Column(Name = "MESSAGE_SUBJECT")]
public String MessageSubject;


... I expect that the MESSAGE_SUBJECT column from the query will populate the MessageSubject property. However, it is not happening. The question is how can I do this?



Other properties are populated without issues as their names are the same as the names of the columns in the query.



The code is below



using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.Text;
using System.Threading.Tasks;

namespace LinqExample1
{

class Record1
{
[Column(CanBeNull = false, IsPrimaryKey = true)]
public int ID;

[Column()]
public String EMAIL_ID_NUMBER;

[Column(Name = "MESSAGE_SUBJECT")]
public String MessageSubject;

public override string ToString()
{
return $"{base.ToString()}. ID={ID}. Name={EMAIL_ID_NUMBER}. MessageSubject={MessageSubject}";
}
}

class Program
{
static void Main(string args)
{
var context = new DataContext(System.Configuration.ConfigurationManager.ConnectionStrings["LinqExample1.Properties.Settings.MyConnectionString"].ToString());
var emailTemplates = context.ExecuteQuery<Record1>("select ID, EMAIL_ID_NUMBER, MESSAGE_SUBJECT from EMAIL_NOTIFICATIONS");
foreach (Record1 emailTemplate in emailTemplates)
{
Console.WriteLine(emailTemplate.ToString());
}
}
}
}


The output that I get looks like below:



LinqExample1.Record1. ID=4. Name=EM 05. MessageSubject=
LinqExample1.Record1. ID=16. Name=EM 06. MessageSubject=
LinqExample1.Record1. ID=17. Name=EM 07. MessageSubject=


E.g. MessageSubject is always empty even if the underlying query returns data for the MESSAGE_SUBJECT column.



There is a couple of potential solutions which I don't like.




  1. Make property names same as column names. E.g. the Record1 class
    will have properties ID, EMAIL_ID_NUMBER, and MESSAGE_SUBJECT.

  2. Use column aliases in the query to match property names. E.g. use query
    "select ID, EMAIL_ID_NUMBER Name, MESSAGE_SUBJECT MessageSubject
    from EMAIL_NOTIFICATIONS" and the Record1 property names ID, Name,
    and MessageSubject.










share|improve this question
















I have a query that retrieves three columns from a table - ID, EMAIL_ID_NUMBER, and MESSAGE_SUBJECT. I want to map these three columns to the properties of an object ID, EMAIL_ID_NUMBER and MessageSubject (The names are chosen to highlight the issue). The problem is that the mapping does not work as I expect.



I expect that when I specify Column(Name = "COLUMN1") next to some property, then the value of the COLUMN1 will be stored into this property. However, it does not work. The value is stored only when the property name is exactly the same as the column name. For example in this case...



[Column(Name = "MESSAGE_SUBJECT")]
public String MessageSubject;


... I expect that the MESSAGE_SUBJECT column from the query will populate the MessageSubject property. However, it is not happening. The question is how can I do this?



Other properties are populated without issues as their names are the same as the names of the columns in the query.



The code is below



using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.Text;
using System.Threading.Tasks;

namespace LinqExample1
{

class Record1
{
[Column(CanBeNull = false, IsPrimaryKey = true)]
public int ID;

[Column()]
public String EMAIL_ID_NUMBER;

[Column(Name = "MESSAGE_SUBJECT")]
public String MessageSubject;

public override string ToString()
{
return $"{base.ToString()}. ID={ID}. Name={EMAIL_ID_NUMBER}. MessageSubject={MessageSubject}";
}
}

class Program
{
static void Main(string args)
{
var context = new DataContext(System.Configuration.ConfigurationManager.ConnectionStrings["LinqExample1.Properties.Settings.MyConnectionString"].ToString());
var emailTemplates = context.ExecuteQuery<Record1>("select ID, EMAIL_ID_NUMBER, MESSAGE_SUBJECT from EMAIL_NOTIFICATIONS");
foreach (Record1 emailTemplate in emailTemplates)
{
Console.WriteLine(emailTemplate.ToString());
}
}
}
}


The output that I get looks like below:



LinqExample1.Record1. ID=4. Name=EM 05. MessageSubject=
LinqExample1.Record1. ID=16. Name=EM 06. MessageSubject=
LinqExample1.Record1. ID=17. Name=EM 07. MessageSubject=


E.g. MessageSubject is always empty even if the underlying query returns data for the MESSAGE_SUBJECT column.



There is a couple of potential solutions which I don't like.




  1. Make property names same as column names. E.g. the Record1 class
    will have properties ID, EMAIL_ID_NUMBER, and MESSAGE_SUBJECT.

  2. Use column aliases in the query to match property names. E.g. use query
    "select ID, EMAIL_ID_NUMBER Name, MESSAGE_SUBJECT MessageSubject
    from EMAIL_NOTIFICATIONS" and the Record1 property names ID, Name,
    and MessageSubject.







c# linq properties mapping columnattribute






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 21 '18 at 15:36







Andrew

















asked Nov 21 '18 at 15:16









AndrewAndrew

513




513













  • Change your property to MESSAGE_SUBJECT

    – Ryan Wilson
    Nov 21 '18 at 15:19













  • Thanks for the reply, but this is not what I want. I want the property names to adhere to the C# naming guidelines, not to what is declared in the database.

    – Andrew
    Nov 21 '18 at 15:26



















  • Change your property to MESSAGE_SUBJECT

    – Ryan Wilson
    Nov 21 '18 at 15:19













  • Thanks for the reply, but this is not what I want. I want the property names to adhere to the C# naming guidelines, not to what is declared in the database.

    – Andrew
    Nov 21 '18 at 15:26

















Change your property to MESSAGE_SUBJECT

– Ryan Wilson
Nov 21 '18 at 15:19







Change your property to MESSAGE_SUBJECT

– Ryan Wilson
Nov 21 '18 at 15:19















Thanks for the reply, but this is not what I want. I want the property names to adhere to the C# naming guidelines, not to what is declared in the database.

– Andrew
Nov 21 '18 at 15:26





Thanks for the reply, but this is not what I want. I want the property names to adhere to the C# naming guidelines, not to what is declared in the database.

– Andrew
Nov 21 '18 at 15:26












0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53415137%2fmapping-a-query-column-to-property-with-the-different-name-in-linq-columnattrib%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53415137%2fmapping-a-query-column-to-property-with-the-different-name-in-linq-columnattrib%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

How to send String Array data to Server using php in android

Title Spacing in Bjornstrup Chapter, Removing Chapter Number From Contents

Is anime1.com a legal site for watching anime?