Concat Two IQueryables with Anonymous Types?

旧时模样 提交于 2019-12-04 03:21:15

As you said previously in the comments, it seems that the two queries return different objects:

Query 1 (as per comment):

f__AnonymousTypee<Leo.Domain.FileItem,Leo.Domain.Employ‌​ee,int,string,string>

Query2 is

f__AnonymousTypee<Leo.Domain.FileItem,L‌​eo.Domain.Employee,int?,string,string>

This is why Concat is giving you an error message complaining about invalid arguments.

Anonymous objects will be equivalent types to other anonymous objects with the same property names and types declared in exactly the same order.

Assuming both query and query2 from from the same contexts, you should be able to combine the two, provided they are queries of equivalent types.

Your comment indicates that neither are of the same type.

query returns objects of type Anon<FileItem, Employee, int, string, string>
query2 returns objects of type Anon<FileItem, Employee, int?, string, string>.

You cannot combine the two because they are of different types. You'll need to make sure that both queries return objects of the same type.

var query = from x in ...
    select new
    {
        A = (FileItem)...
        B = (Employee)...
        C = (int)...
        ...
    };

var query2 = from y in ...
    select new
    {
        A = (FileItem)...
        B = (Employee)...
        C = (int)...
        ...
    };

The IDE determined query and query2 are of different types, while the IEnumerable<TSource> Concat<TSource>() extension method expects two same types (IEnumerable<TSource>). The three TSource's must be the same.

string[] strA = {"123", "234", "345"};
int[] intA = { 1, 2, 3 };
var query = from s in strA
            select s;
var query2 = from i in strA // intA
                select i;
var query3 = query.Concat(query2);

Uncomment "// intA" in VS and you'll see the difference.

Are you missing any namespace? Normally I mark my .NET Project Properties to target .net 4.0 for vs 2010. I do not use .net 4.0 Client Profile.

Please make sure that the types of A, B and C is matches in both the query anonymous types. Also the order of A, B and C should also match in both queries.

The following example works like a charm.

namespace Test
{
    using System;
    using System.Collections.Generic;
    using System.Linq;

    internal class Employee
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public double Salary { get; set; }
        public string Address { get; set; }
    }

    internal class Program
    {
        private static List<Employee> employees = new List<Employee>();

        private static void BuildList()
        {
            employees.AddRange(
                new Employee[]
                    {
                        new Employee() {Name = "Tom", Age = 22, Address = "sample1", Salary = 10000},
                        new Employee() {Name = "Mithun", Age = 27, Address = "sample1", Salary = 20000},
                        new Employee() {Name = "Jasubhai", Age = 24, Address = "sample1", Salary = 12000},
                        new Employee() {Name = "Vinod", Age = 34, Address = "sample1", Salary = 30000},
                        new Employee() {Name = "Iqbal", Age = 52, Address = "sample1", Salary = 50000},
                        new Employee() {Name = "Gurpreet", Age = 22, Address = "sample1", Salary = 10000},

                    }
                );
        }

        private static void Main(string[] args)
        {
            BuildList();
            var query = from employee in employees
                        where employee.Age < 27
                        select new
                            {
                                A = employee.Name,
                                B = employee.Age,
                                C = employee.Salary
                            };


            var query2 = from employee in employees
                         where employee.Age > 27
                         select new
                             {
                                 A = employee.Name,
                                 B = employee.Age,
                                 C = employee.Salary
                             };

            var result = query.Concat(query2);

            foreach (dynamic item in result.ToArray())
            {
                Console.WriteLine("Name = {0}, Age = {1}, Salary = {2}", item.A, item.B, item.C);
            }
        }


    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!