2017-01-28 4 views
1

Вот мой код. Я хотел бы объединить этот 2 LINQ Query в один результат var. Я использую следующие методы:Как объединить этот два запроса LINQ в одном результате var

var result = queryOne.Union(queryTwo); 
var result = queryOne.Concat(queryTwo); 
var result = Enumerable.Union(queryOne, queryTwo); 

Это не работает. Как это сделать правильно? Я недавно в LINQ и C#.

var queryOne = await (from x in _context.DwPropertyMasters 
            where 
            x.LandId == 2 
            select new 
            { 
             x.LandId, 
             x.MapPointX, 
             x.MapPointY, 
             x.Location, 
             a = x.Development == null || x.Development == "" ? x.Location : x.Development, 
             AreaSize = x.AreaSize ?? 0, 
             Premium = x.Premium ?? 0, 
             b = (((x.Premium == 0 ? null : x.Premium) * 100000000)/(x.AreaSize == 0 ? null : x.AreaSize)) ?? 0, 
             x.Developer, 
             x.YearTender, 
             c = x.Development ?? x.Location, 
             AreaSize2 = x.AreaSize2 ?? 0, 
             d = (((x.Premium == 0 ? null : x.Premium) * 100000000)/(x.AreaSize2 == 0 ? null : x.AreaSize2)) ?? 0, 
            }).ToArrayAsync(); 

      var queryTwo = await (from y in _context.DwPropertyDetails 
            where 
            y.LandId == 2 
            orderby 
            y.Block, 
            y.Asp descending 
            select new 
            { 
             y.LandDetailId, 
             y.LandId, 
             a = y.Pasp ?? "", 
             b = y.Asp ?? "", 
             c = y.Tasp ?? "", 
             y.Block, 
             y.Floor, 
             y.Unit, 
             d = y.CarParking ?? "", 
             y.SalePrice, 
             e = y.Revision ?? "", 
             y.VendorRelate, 
             y.TransactionPrice, 
             y.FlatType, 
             y.ActualSize, 
             f = 
             ((y.TransactionPrice == 0 ? null : y.TransactionPrice)/(y.ActualSize == 0 ? null : y.ActualSize)) ?? 
             0 
            }).ToArrayAsync(); 

      var singleQuery = queryOne.Union(queryTwo); 



var result = queryOne.Union(queryTwo); 
    var result = queryOne.Concat(queryTwo); 
    var result = Enumerable.Union(queryOne, queryTwo); 

Это не работает. Как это сделать правильно? Я недавно в LINQ и C#.

+0

Да, аргументы типа для метода 'IEnumerable System.Linq.Enumerable.Union (это IEnumerable , IEnumerable Fred

+0

Вы проверили отдельные запросы для результата. – Vijay

+0

Да, у них разные свойства и ценности. – Fred

ответ

0

Ваш вопрос не имеет контекста прямо сейчас, но поскольку единственная причина, по которой вы не смогли бы конкатенировать 2 IEnumerable<T>, состоит в том, что они имеют различный тип.

Если вы используете анонимный тип на 2-х местах, это подходящее время, чтобы сделать этот анонимный тип в своем собственном классе, таким образом вы сможете получить .Concat 2 результата.

Но снова вы можете увидеть некоторые очевидные различия в ваших двух типах запросов. Другим вариантом было бы создание третьего типа, который принимает все члены других двух запросов.

+0

Благодарим вас за предложение. Но есть ли другой способ выполнить этот два запроса LINQ? Я не знаю, как это сделать. – Fred

+0

Я добавил дополнительную информацию @Fred –

+0

Как это сделать? Можете ли вы привести мне пример? Пожалуйста? – Fred

1

Ваш первый LINQ возвращает перечислимый из разных объектов, чем второй, и вы не можете объединить эти два. Они должны возвращать объекты того же типа.

var query1 = Enumerable.Range(1, 10) 
    .Select(i => new 
    { 
     Id = i, 
     Ids = 0 // See, this object has more properties than the second query's object. 
    }); 

var query2 = Enumerable.Range(11, 20) 
    .Select(i => new 
    { 
     Id = i, 
    }); 

query1.Concat(query2); // Won't compile! 

Вы должны использовать один и тот же ряд свойств для каждого в том же порядке и типа, или вы можете определить пользовательский класс для этого.

+1

* каждый в одном порядке * И тип :) –