Mapping a query column to property with the different name in LINQ. ColumnAttribute.Name does not work
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.
- Make property names same as column names. E.g. the Record1 class
will have properties ID, EMAIL_ID_NUMBER, and MESSAGE_SUBJECT. - 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
add a comment |
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.
- Make property names same as column names. E.g. the Record1 class
will have properties ID, EMAIL_ID_NUMBER, and MESSAGE_SUBJECT. - 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
Change your property toMESSAGE_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
add a comment |
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.
- Make property names same as column names. E.g. the Record1 class
will have properties ID, EMAIL_ID_NUMBER, and MESSAGE_SUBJECT. - 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
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.
- Make property names same as column names. E.g. the Record1 class
will have properties ID, EMAIL_ID_NUMBER, and MESSAGE_SUBJECT. - 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
c# linq properties mapping columnattribute
edited Nov 21 '18 at 15:36
Andrew
asked Nov 21 '18 at 15:16
AndrewAndrew
513
513
Change your property toMESSAGE_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
add a comment |
Change your property toMESSAGE_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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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