Search code examples
c#listlinqvar

Use anonymous type for LINQ based lists instead of var


I've LINQ requests that return anonymous types like:

var result = context.Table1.Select(
    x => new
    {
        col1 = x.col1,
        col2 = x.col2
    }).ToList();

That works fine, until I want to hand over the result to another function.

Than I need to specify exactly, what's type the list is. I cannot use var anymore.

But if I use

List< (string col1, string col2)> result ...

I get an "Cannot implicitly convert type ..." error.

Yes, I can create a new class for each entity. But is this the only way to handle it?


Solution

  • If you want to use a tuple type (that's what your (string col1, string col2) is) instead of an anonymous type (that's what your new { col1=x.col1...} is), you need another syntax:

    List<(string col1, string col2)> list = context.Table1
        .Select( // linq to entities
        x => new
        {
            col1 = x.col1,
            col2 = x.col2
        })
        .ToArray() // go on with linq to objects for use of tuple types
        .Select(x => (col1: x.col1, col2: x.col2))
        .ToList();
    

    ValueTuples aren't supported in Expression trees, so you might need to use a combination of anonymous types and tuple types in your query

    See Tuple types, Choosing between anonymous and tuple types