2015-03-26 3 views
0

У меня есть запрос, как этотСвести результат Linq запроса

var q = from a in audits 
     join c in customers on a.CustomerID equals c.CustomerID 
     select new { a, c }; 
return ControllerContext.Request.CreateResponse(HttpStatusCode.OK, 
    new { results = q.ToList() }); 

Когда я посылаю результат этого в браузер я получаю эту

results 
0: 
    a: 
     field1: '', 
     field2: '' 
    c: 
     column1: '', 
     column2: '' 
1: {} 
.... 

Как изменить C# поэтому результат вот так:

results 
0: 
    field1: '', 
    field2: '' 
    column1: '', 
    column2: '' 
1: {} 
.... 

ответ

1

Простое создание анонимного типа со свойствами 'a' и 'c' должно сделать трюк.

var q = from a in audits 
     join c in customers on a.CustomerID equals c.CustomerID 
     select new { a.field1, a.field2, c.column1, c.column2 }; 

Изучите метод расширения SelectMany, который работает с linq-основанием. Он используется для выравнивания при использовании lambda based linq.

+0

а имеет около 20 столбцов и с около 100 колонн ... мне нужно что-то лучше ... – Paul

+0

Вы могли бы использовать отражение для создания Expressi на дереве, который может быть передан методу 'Select', но потому, что вам нужно будет создать новый тип во время выполнения для хранения результатов, я не думаю, что это действительно сработает (этот тип не будет использоваться, потому что вам придется использовать рефлексию, чтобы получить что-либо от наших результатов). – MarcinJuraszek

0

С ответом отсюда, вы должны использовать динамический объект, который только доступна для C# 4.0 или более поздней версии: Is there an easy way to merge C# anonymous objects

Во-первых, вы создаете функцию:

static dynamic Combine(dynamic item1, dynamic item2) 
{ 
var dictionary1 = (IDictionary<string, object>)item1; 
var dictionary2 = (IDictionary<string, object>)item2; 
var result = new ExpandoObject(); 
var d = result as IDictionary<string, object>; //work with the Expando as a Dictionary 

foreach (var pair in dictionary1.Concat(dictionary2)) 
{ 
    d[pair.Key] = pair.Value; 
} 

return result; 
} 

А потом просто назвать его в LINQ:

var q = from a in audits 
    join c in customers on a.CustomerID equals c.CustomerID 
    select Combine(a, c); 
Смежные вопросы