LINQ to SQL Проблемы с соединением с FirstOrDefault () - PullRequest
4 голосов
/ 06 апреля 2011

Я опубликовал вопрос ранее, но теперь я сузил проблемы, и это нечто совсем другое. По сути, у меня довольно длинный запрос, целью которого является выбор значений из базы данных в пользовательскую структуру (которую я покажу ниже), но у меня возникают проблемы с объединением - попытка выбрать только первую строку объединения , Вот мой запрос:

IENumerable<VehicleDetails> list = (
    from s in dc.Vehicles
    join veh in dc.VehicleTypes 
        on s.VehicleType equals veh.ID into vg
    from v in vg.DefaultIfEmpty()
    join consignments in dc.Consignments
        .FirstOrDefault(x => x.TripDate > dateFrom && 
            x.TripDate < dateTo && 
            x.DeliveryDepot == depot.Letter && 
            (x.DeliveryStatus == 2 || x.DeliveryStatus == 3)) 
        on new
        {
            Reg = s.VehicleReg, 
            Depot = s.VehicleDepot 
        } equals new
        {
            Reg = consignments.VehicleReg, 
            Depot = consignments.DeliveryDepot
        } into con
    from c in con.DefaultIfEmpty()
    select new 
    {
        VehicleType = (
            s.VehicleType == null ? "?":
            v.VehicleType1.ToString()),
        TotalRate = c.Rate + c.AddCharges,
        VehicleReg = (string.IsNullOrEmpty(c.VehicleReg) ? 
            c.Subcontractor: c.VehicleReg),
        VehicleTypeName = (v.VehicleTypeDescription ==  null ? 
            "SubContractor": v.VehicleTypeDescription)
    }); 

Моя структура:

public struct VehicleDetails
{
     internal string VehicleType;
     internal decimal TotalRate;
     internal string VehicleReg;
     internal string VehicleTypeName;
}

С FirstOrDefault() во втором соединении я получаю:

Тип одного из выражений в условие соединения неверно. Тип не удалось сделать вывод при вызове группы присоединиться.

Без этого (и вместо замены FirstOrDefault на Where) я получаю ошибку об отсутствии прозрачности, преобразующей anonymoustype в тип «vehicledetials». Обе ошибки возникают при вызове from c in con.DefaultIfEmpty().

Любые идеи будут очень, очень ценится

Ответы [ 2 ]

11 голосов
/ 06 апреля 2011

FirstOrDefault () с готовностью вернет один элемент, но вам нужна коллекция (IQueryable) элементов.

Так что

dc.Consignments
    .Where(x => x.TripDate > dateFrom && 
                x.TripDate < dateTo && 
                x.DeliveryDepot == depot.Letter && 
                (x.DeliveryStatus == 2 || x.DeliveryStatus == 3))
   .Take(1)

вернет отложенную коллекцию, которая будет иметьтолько один элемент.

0 голосов
/ 06 апреля 2011

Почему бы вам не упростить ваш запрос !!

  1. Я настоятельно рекомендую использовать FirstOrDefault() в конце запроса (последний метод вашего запроса).
  2. Поставьте ваше условие на Where лучше вместо FirstOrDefaultтак как вы собираетесь поставить его в конце

Я думаю, что ваша ошибка здесь FirstOrDefault с join, когда вы используете объединение, вы должны объединить коллекцию, а не один элемент(один - результат FirstOrDefault)

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