2013-04-08 66 views
2

抓住這個Linq查詢的頭。它是實體框架。該查詢將轉換爲不同的模型對象。如果我評論或刪除了我指出的導致linq查詢出錯的代碼區域。但在我看來,我應該能夠寫出這樣的查詢與出現此錯誤:Linq to EF系統不支持異常System.NotSupportedException

無法創建類型'DomainModel.Model.CustomerAddress'的空常量值。在此上下文中僅支持實體類型,枚舉類型或基本類型。

任何人都可以告訴我爲什麼我不能或者更重要的是我需要改變以使其工作嗎?

感謝

var orders = from o in _db.Orders 
          .Include("User") 
          .Include("OrderItems.Inventories.Product") 
          .Include("Transactions") 
          .Include("CustomerAddressBilling.Address") 
          .Include("CustomerAddressBilling.Customer") 
          .Include("CustomerAddressBilling.Contact") 
          .Include("CustomerAddressShipping.Address") 
          .Include("CustomerAddressShipping.Customer") 
          .Include("CustomerAddressShipping.Contact") 
          .Include("ShippingMethod") 
        // this works ok 
         let items = (o.OrderItems.Select(i => new Model.OrderItem 
         { 
          OrderItemId = i.OrderItemId, 
          OrderId = i.OrderId, 
          DateAdded = i.CreateDate, 
          LineItemPrice = i.Inventories.Sum(ii => ii.Product.Price), 
          Product = i.Inventories.FirstOrDefault().Product, 
          Quantity = i.Inventories.Count() 
         })) 
        // this works ok 
        let transactions = (o.Transactions.Select(t => new Model.Transaction 
         { 
          Id = t.TransactionId, 
          OrderId = t.OrderId, 
          Amount = t.Amount, 
          AuthorizationCode = t.AuthorizationCode, 
          DateExecuted = t.TransactionDate, 
          Notes = t.Notes, 
          Processor = (Model.TransactionProcessor)t.ProcessorId 
         })) 
        // this causes the error 
        let cab = o.CustAddBillingId.HasValue ? (new Model.CustomerAddress 
         { 
          Id = o.CustomerAddressBilling.CustAddId, 
          UserName = o.User.UserName, 
          FirstName = o.CustomerAddressBilling.Customer.FirstName, 
          LastName = o.CustomerAddressBilling.Customer.LastName, 
          MiddleInitial = o.CustomerAddressBilling.Customer.MiddleName, 
          Salutation = o.CustomerAddressBilling.Customer.Salutation, 
          Suffix = o.CustomerAddressBilling.Customer.Suffix, 
          Street1 = o.CustomerAddressBilling.Address.Line1, 
          Street2 = o.CustomerAddressBilling.Address.Line2, 
          Street3 = o.CustomerAddressBilling.Address.Line3, 
          City = o.CustomerAddressBilling.Address.City, 
          StateOrProvince = o.CustomerAddressBilling.Address.State, 
          Zip = o.CustomerAddressBilling.Address.PostalCode, 
          Country = o.CustomerAddressBilling.Address.Country, 
          Latitude = o.CustomerAddressBilling.Address.Lat, 
          Longitude = o.CustomerAddressBilling.Address.Long, 
          Email = o.CustomerAddressBilling.Contact.ContactInfo, 
          IsDefault = o.CustomerAddressBilling.IsPrimary 
         }) : default(Model.CustomerAddress) 
        // this causes the error 
        let cas = o.CustAddShippingId.HasValue ? (new Model.CustomerAddress 
         { 
          Id = o.CustomerAddressShipping.CustAddId, 
          UserName = o.User.UserName, 
          FirstName = o.CustomerAddressShipping.Customer.FirstName, 
          LastName = o.CustomerAddressShipping.Customer.LastName, 
          MiddleInitial = o.CustomerAddressShipping.Customer.MiddleName, 
          Salutation = o.CustomerAddressShipping.Customer.Salutation, 
          Suffix = o.CustomerAddressShipping.Customer.Suffix, 
          Street1 = o.CustomerAddressShipping.Address.Line1, 
          Street2 = o.CustomerAddressShipping.Address.Line2, 
          Street3 = o.CustomerAddressShipping.Address.Line3, 
          City = o.CustomerAddressShipping.Address.City, 
          StateOrProvince = o.CustomerAddressShipping.Address.State, 
          Zip = o.CustomerAddressShipping.Address.PostalCode, 
          Country = o.CustomerAddressShipping.Address.Country, 
          Latitude = o.CustomerAddressShipping.Address.Lat, 
          Longitude = o.CustomerAddressShipping.Address.Long, 
          Email = o.CustomerAddressShipping.Contact.ContactInfo, 
          IsDefault = o.CustomerAddressShipping.IsPrimary 
         }) : default(Model.CustomerAddress) 
        // this causes the error 
        let sm = o.ShippingMethodId.HasValue ? (new ShippingMethod 
          { 
           Id = o.ShippingMethod.ShippingMethodId, 
           Carrier = o.ShippingMethod.Carrier, 
           ServiceName = o.ShippingMethod.ServiceName, 
           BaseRate = o.ShippingMethod.BaseRate, 
           RatePerPound = o.ShippingMethod.RatePerPound, 
           DaysToDeliver = o.ShippingMethod.DaysToDeliver, 
           EstimatedDelivery = o.ShippingMethod.EstimatedDelivery 
          }) : default(ShippingMethod) 
        select new Model.Order 
         { 
          Id = o.OrderId, 
          UserName = o.User.UserName, 
          DateCreated = o.CreateDate, 
          Items = items.AsQueryable(), 
          Transactions = transactions.AsQueryable(), 
          ShippingAddressId = o.CustAddShippingId, 
          BillingAddressId = o.CustAddBillingId, 
          // have to comment these next 3 lines as well 
          ShippingAddress = cas, 
          BillingAddress = cab, 
          ShippingMethod = sm, 
          // to here 
          UserLanguageCode = "en", 
          DateShipped = o.ShippedDate, 
          EstimatedDelivery = o.EstimatedDelivery, 
          TrackingNumber = o.TrackingNumber, 
          TaxAmount = o.TaxAmount, 
          DiscountReason = o.DiscountReason, 
          DiscountAmount = o.DiscountAmount 
         }; 
+0

嘗試用'null'代替'default(Model.CustomerAddress)' – 2013-04-08 09:36:26

+0

這樣做,沒關係。我認爲這與cab,cas和sm是對單個對象的引用而不是對集合的引用有關。 – 2013-04-08 15:03:16

+0

有朋友建議這個錯誤是由於let子句中的三元表達式引起的。但我無法弄清楚如何擺脫它。 – 2013-04-10 18:09:12

回答

0

好吧,我想通了這一點。問題是數據庫允許這些相關實體的空密鑰,我更改了數據庫,以便forien密鑰不可爲空,並從數據庫更新模型。我創建了代表非ShippingMethods電子和麪對面的新數據實體,並且還具有親自的CustomerAddress,因此我可以鏈接到數據,這不僅代表我沒有數據,但爲什麼我沒有數據。

public IQueryable<Model.Order> GetOrders() 
    { 
     var orders = from o in _db.Orders 
            .Include("User") 
            .Include("OrderItems.Inventories.Product") 
            .Include("Transactions") 
            .Include("CustomerAddressBilling.Address") 
            .Include("CustomerAddressBilling.Customer") 
            .Include("CustomerAddressBilling.Contact") 
            .Include("CustomerAddressShipping.Address") 
            .Include("CustomerAddressShipping.Customer") 
            .Include("CustomerAddressShipping.Contact") 
            .Include("ShippingMethod") 
        let items = (o.OrderItems.Select(i => new Model.OrderItem 
         { 
          OrderItemId = i.OrderItemId, 
          OrderId = i.OrderId, 
          DateAdded = i.CreateDate, 
          LineItemPrice = i.Inventories.Sum(ii => ii.Product.Price), 
          Product = i.Inventories.FirstOrDefault().Product, 
          Quantity = i.Inventories.Count() 
         })) 
        let transactions = (o.Transactions.Select(t => new Model.Transaction 
         { 
          Id = t.TransactionId, 
          OrderId = t.OrderId, 
          Amount = t.Amount, 
          AuthorizationCode = t.AuthorizationCode, 
          DateExecuted = t.TransactionDate, 
          Notes = t.Notes, 
          Processor = (Model.TransactionProcessor)t.ProcessorId 
         })) 
        let cab = new Model.CustomerAddress 
         { 
          Id = o.CustomerAddressBilling.CustAddId, 
          UserName = o.User.UserName, 
          FirstName = o.CustomerAddressBilling.Customer.FirstName, 
          LastName = o.CustomerAddressBilling.Customer.LastName, 
          MiddleInitial = o.CustomerAddressBilling.Customer.MiddleName, 
          Salutation = o.CustomerAddressBilling.Customer.Salutation, 
          Suffix = o.CustomerAddressBilling.Customer.Suffix, 
          Street1 = o.CustomerAddressBilling.Address.Line1, 
          Street2 = o.CustomerAddressBilling.Address.Line2, 
          Street3 = o.CustomerAddressBilling.Address.Line3, 
          City = o.CustomerAddressBilling.Address.City, 
          StateOrProvince = o.CustomerAddressBilling.Address.State, 
          Zip = o.CustomerAddressBilling.Address.PostalCode, 
          Country = o.CustomerAddressBilling.Address.Country, 
          Latitude = o.CustomerAddressBilling.Address.Lat, 
          Longitude = o.CustomerAddressBilling.Address.Long, 
          Email = o.CustomerAddressBilling.Contact.ContactInfo, 
          IsDefault = o.CustomerAddressBilling.IsPrimary 
         } 
        let cas = new Model.CustomerAddress 
         { 
          Id = o.CustomerAddressShipping.CustAddId, 
          UserName = o.User.UserName, 
          FirstName = o.CustomerAddressShipping.Customer.FirstName, 
          LastName = o.CustomerAddressShipping.Customer.LastName, 
          MiddleInitial = o.CustomerAddressShipping.Customer.MiddleName, 
          Salutation = o.CustomerAddressShipping.Customer.Salutation, 
          Suffix = o.CustomerAddressShipping.Customer.Suffix, 
          Street1 = o.CustomerAddressShipping.Address.Line1, 
          Street2 = o.CustomerAddressShipping.Address.Line2, 
          Street3 = o.CustomerAddressShipping.Address.Line3, 
          City = o.CustomerAddressShipping.Address.City, 
          StateOrProvince = o.CustomerAddressShipping.Address.State, 
          Zip = o.CustomerAddressShipping.Address.PostalCode, 
          Country = o.CustomerAddressShipping.Address.Country, 
          Latitude = o.CustomerAddressShipping.Address.Lat, 
          Longitude = o.CustomerAddressShipping.Address.Long, 
          Email = o.CustomerAddressShipping.Contact.ContactInfo, 
          IsDefault = o.CustomerAddressShipping.IsPrimary 
         } 
        let sm = new ShippingMethod 
         { 
          Id = o.ShippingMethod.ShippingMethodId, 
          Carrier = o.ShippingMethod.Carrier, 
          ServiceName = o.ShippingMethod.ServiceName, 
          BaseRate = o.ShippingMethod.BaseRate, 
          RatePerPound = o.ShippingMethod.RatePerPound, 
          DaysToDeliver = o.ShippingMethod.DaysToDeliver, 
          EstimatedDelivery = o.ShippingMethod.EstimatedDelivery 
         } 
        select new Model.Order 
         { 
          Id = o.OrderId, 
          UserName = o.User.UserName, 
          DateCreated = o.CreateDate, 
          Items = items.AsQueryable(), 
          Transactions = transactions.AsQueryable(), 
          ShippingAddressId = o.CustAddShippingId, 
          BillingAddressId = o.CustAddBillingId, 
          ShippingAddress = cas, 
          BillingAddress = cab, 
          ShippingMethod = sm, 
          UserLanguageCode = "en", 
          DateShipped = o.ShippedDate, 
          EstimatedDelivery = o.EstimatedDelivery, 
          TrackingNumber = o.TrackingNumber, 
          TaxAmount = o.TaxAmount, 
          DiscountReason = o.DiscountReason, 
          DiscountAmount = o.DiscountAmount 
         }; 
     return orders; 
    } 

沒有錯誤!

相關問題