Benny Ae
Benny Ae

Reputation: 2016

C# Linq SQL select Multiple columns to List

Hi I want to select 4 columns form DB then select to a List

public struct keyData
{

    public int pid;
    public int sid;
    public string proid;
    public string title;
}
Entities dbconn = new Entities();
List<keyData> temRes = (
    from viewData in dbconn.vw1
    join hData in dbconn.tableH
    on new { pid= (int)viewData.pid, proid= viewData.proid}
    equals new { pid= (int)hData .pid, proid= hData .proid}
    into joinSet
    from joinUnit in joinSet.DefaultIfEmpty()
    where joinUnit == null
    select new { pid= (int)viewData.pid, sid= (int)viewData.sid, proid= viewData.proid, Title=viewData.Title }
    ).ToList();

then it says:

Error 3 Cannot implicitly convert

type 'System.Collections.Generic.List<AnonymousType#1>' 

to 'System.Collections.Generic.List<hl.Program.keyData>'

thanks

using MarcinJuraszek 's idea

it gives me :

Only parameterless constructors and initializers are supported in LINQ to Entities

Upvotes: 1

Views: 15399

Answers (4)

AR M
AR M

Reputation: 313

I have answered similar question here.You can simply do this using SELECT and SELECTMANY https://stackoverflow.com/a/27755340/2764258

Upvotes: 0

Pavel Bogdanov
Pavel Bogdanov

Reputation: 61

As it was said you must return keyData instances instead of anonimous type https://stackoverflow.com/a/19529805/1034373. But struct can't have an explicit parameterless constructor so you must either change keyData type to class or add a counstructor

public struct keyData
{
    public keyData(int pid, int sid, string proid, string title)
    {
         this.pid = pid;
         this.sid = sid;
         this.proid = proid;
         this.title = title;
    }
    public int pid;
    public int sid;
    public string proid;
    public string title;
}

and write code like this

List<keyData> temRes = (
    from viewData in dbconn.vw1
    join hData in dbconn.tableH
    on new { pid= (int)viewData.pid, proid= viewData.proid}
    equals new { pid= (int)hData .pid, proid= hData .proid}
    into joinSet
    from joinUnit in joinSet.DefaultIfEmpty()
    where joinUnit == null
    select new { pid= (int)viewData.pid, sid= (int)viewData.sid, proid= viewData.proid, Title=viewData.Title }
    ).ToList().Select(x => new keyData(x.pid, x.sid, x.proid, x.title)).ToList();

Upvotes: 0

Hardik Patel
Hardik Patel

Reputation: 327

Entities dbconn = new Entities();
List<keyData> temRes = (
    from viewData in dbconn.vw1.ToList()
    join hData in dbconn.tableH.ToList()
    on new { pid= (int)viewData.pid, proid= viewData.proid}
    equals new { pid= (int)hData .pid, proid= hData .proid}
    into joinSet
    from joinUnit in joinSet.DefaultIfEmpty()
    where joinUnit == null
    select new { pid= (int)viewData.pid, sid= (int)viewData.sid, proid= viewData.proid,  Title=viewData.Title }
    ).ToList();

Upvotes: 0

MarcinJuraszek
MarcinJuraszek

Reputation: 125620

That's because your quere return an anonymous type objects. Change it to return keyData instances instead:

    List<keyData> temRes = (
        from viewData in dbconn.vw1
        join hData in dbconn.tableH
        on new { pid= (int)viewData.pid, proid= viewData.proid}
        equals new { pid= (int)hData .pid, proid= hData .proid}
        into joinSet
        from joinUnit in joinSet.DefaultIfEmpty()
        where joinUnit == null
        select new keyData() { pid= (int)viewData.pid, sid= (int)viewData.sid, proid= viewData.proid, Title=viewData.Title }
        ).ToList();

The difference is in select clause. I've added your class name after new keyword.

Upvotes: 5

Related Questions