Решить ошибку приведения в лямбду - PullRequest
0 голосов
/ 06 марта 2012

Я использую следующий код в службах wcf ria (приложение Silverlight):

 public partial class BillingWaterDomainService : LinqToEntitiesDomainService<BilingWaterEntities>
    {
        public ObservableCollection<PaymentSummary> GetPaymentSummary(long requestId)
        {
            var paymentSummaries = new ObservableCollection<PaymentSummary>();

            var result = GetRequestCostDetailsByRequestId(requestId);
            foreach (var requestCostDetail in result.Where(r=>r.BranchCostId.HasValue))
            {
                if (requestCostDetail.Debtor.HasValue)
                {
                    RequestCostDetail detail = requestCostDetail;

                    long? costCustomerPrice = 0;                       
                    costCustomerPrice =
                        result.Where(
                            r => r.CostCustomerDetail.CostCustomerType.CostTypeId == detail.BranchCostDetail.CostType && r.Creditor.HasValue).
                            Sum(r => r.Creditor != null ? r.Creditor.Value : 0);

                    paymentSummaries.Add(new PaymentSummary()
                                             {
                                                 PaymentTitle = requestCostDetail.BranchCostDetail.CostType1.CostTitle,
                                                 Price = requestCostDetail.Debtor.Value-(costCustomerPrice.HasValue ? costCustomerPrice.Value:0)
                                             });
                }
            }


            return paymentSummaries;
        }
    }

Когда я пытаюсь выполнить этот код, у меня появляется следующая ошибка:

Invoke Operation 'GetPaymentSummary 'failed. Преобразование к типу значения' Int64 'завершилось неудачно, поскольку материализованное значение имеет значение null. Либо универсальный параметр типа результата, либо запрос должен использовать обнуляемый тип

. Эта ошибка возникает в следующих случаях.строка кода:

costCustomerPrice =result.Where(
                            r => r.CostCustomerDetail.CostCustomerType.CostTypeId == detail.BranchCostDetail.CostType && r.Creditor.HasValue).
                            Sum(r => r.Creditor != null ? r.Creditor.Value : 0);

И этот кусок кода:

r => r.CostCustomerDetail.CostCustomerType.CostTypeId

как я могу решить эту проблему?!

Ответы [ 3 ]

1 голос
/ 07 марта 2012

Кажется, что r => r.CostCustomerDetail.CostCustomerType.CostTypeId является нулевым для некоторых записей. Попробуйте добавить условие:

results.Where(r => r.CostCustomerDetail.CostCustomerType.CostTypeId.HasValue)
    .Where(... 

Или, может быть, даже r.CostCustomerDetail.CostCustomerType иногда равен нулю.

Вы также можете сделать это:

... .Select(r => r.Creditor != null ? r.Creditor.Value : 0)
       .DefaultIfEmpty(0).Sum()
0 голосов
/ 29 апреля 2012

В методе Befor Sum используется метод ToList. если вы измените этот код:

costCustomerPrice =
                        result.Where(
                            r => r.CostCustomerDetail.CostCustomerType.CostTypeId == detail.BranchCostDetail.CostType && r.Creditor.HasValue).
                            Sum(r => r.Creditor != null ? r.Creditor.Value : 0);

к этому коду:

costCustomerPrice =
                        result.Where(
                            r => r.CostCustomerDetail.CostCustomerType.CostTypeId == detail.BranchCostDetail.CostType && r.Creditor.HasValue).ToList().
                            Sum(r => r.Creditor != null ? r.Creditor.Value : 0);

Ваша программа работает без ошибок!

0 голосов
/ 06 марта 2012

В какой-то момент вы пытаетесь вызвать GetPaymentSummary и передать ему нулевой аргумент.Вы говорите, что вызываете его со стороны клиента - каким-то образом нулевое значение передается как requestId.

. Возможно, вы захотите изменить метод так, чтобы он принимал long?, и сначала проверьте, чтоit HasValue - таким образом вы можете справиться со случаем неправильного ввода без серьезных сбоев.

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