2016-10-13 7 views
1

Ich habe ein Problem über Liste zu Liste Problem.C# Converting List wirft Ausnahme in linq Abfrage

Meine Models:

public partial class OrderDetail 
{ 
    public int Id { get; set; } 
    public int OrderId { get; set; } 
    public string SparePartName { get; set; } 
    public Nullable<decimal> SparePartPrice { get; set; } 
    public Nullable<decimal> Labor { get; set; } 
    public Nullable<decimal> Total { get; set; } 
    public string Comment { get; set; } 
} 

public partial class Orders 
{ 
    public int Id { get; set; } 
    public int CustomerId { get; set; } 
    public int StorageId { get; set; } 
    public int UserId { get; set; } 
    public Nullable<System.DateTime> DateEntry { get; set; } 
    public Nullable<System.DateTime> DateRelease { get; set; } 
    public Nullable<System.DateTime> DateEstimatedRelease { get; set; } 
    public Nullable<System.DateTime> DateUpdate { get; set; } 
    public Nullable<decimal> Price { get; set; } 
    public int Status { get; set; } 
    public string FollowCode { get; set; } 
    public string DeviceBrand { get; set; } 
    public string DeviceModel { get; set; } 
    public string DeviceSerialNumber { get; set; } 
    public string DeviceComplaint { get; set; } 
    public string Comment { get; set; } 
} 

Meine Viewmodel:

public class VMOrderEdit 
{ 
    public int Id { get; set; } 
    public int StorageId { get; set; } 
    public int UserId { get; set; } 
    public string StorageName { get; set; } 
    public string CustomerName { get; set; } 
    public string CustomerTelephone { get; set; } 
    public DateTime? DateEntry { get; set; } 
    public DateTime? DateUpdate { get; set; } 
    public DateTime? DateRelease { get; set; } 
    public DateTime? DateEstimatedRelease { get; set; } 
    public decimal? Price { get; set; } 
    public string StatusName { get; set; } 
    public string FollowCode { get; set; } 
    public string DeviceBrand { get; set; } 
    public string DeviceModel { get; set; } 
    public string DeviceSerialNumber { get; set; } 
    public string DeviceComplaint { get; set; } 
    public string Comment { get; set; } 
    public int MyProperty { get; set; } 
    public List<VMOrderEditDetails> Details { get; set; } 
} 
public class VMOrderEditDetails 
{ 
    public int Id { get; set; } 
    public int OrderId { get; set; } 
    public string SparePartName { get; set; } 
    public decimal SparePartPrice { get; set; } 
    public decimal Labor { get; set; } 
    public decimal Total { get; set; } 
    public string Comment { get; set; } 
} 

Mein Controller:

List<VMOrderEdit> OrderEditObj = (from o in DB.Orders 
            join sn in DB.OrderStatusName on o.Status equals sn.Id 
            join st in DB.Storages on o.StorageId equals st.Id 
            join c in DB.Customers on o.CustomerId equals c.Id 
            where o.Id == Id 
            select new VMOrderEdit() 
            { 
             Id = o.Id, 
             StorageId = o.StorageId, 
             StorageName = st.Name, 
             UserId = o.UserId, 
             CustomerName = c.NameSurname, 
             CustomerTelephone = c.Telephone, 
             DateEntry = o.DateEntry, 
             DateUpdate = o.DateUpdate, 
             DateRelease = o.DateRelease, 
             Price = o.Price, 
             StatusName = sn.Name, 
             FollowCode = o.FollowCode, 
             DeviceBrand = o.DeviceBrand, 
             DeviceModel = o.DeviceModel, 
             DeviceSerialNumber = o.DeviceSerialNumber, 
             DeviceComplaint = o.DeviceComplaint, 
             Comment = o.Comment, 
             Details = DB.OrderDetail.Where(x => x.OrderId == o.Id).ToList() 
             } 
           ).ToList(); 

auf dieser Linie:

Details = DB.OrderDetail.Where(x => x.OrderId == o.Id).ToList() 

Visual Studio gibt diesen Fehler:

Cannot implicitly convert type 'System.Collections.Generic.List' to 'System.Collections.Generic.List

wie kann ich diesen Fehler umgehen?

+0

'Details' ist eine' VMOrderEditDetails' Liste während 'DB.OrderDetail' ist (ich gehe davon) ein' OrderDetail' enumerable. – apokryfos

+0

Die Frage ist, was 'OrderDetails' in 'Details' gespeichert werden soll, und dann eine geschachtelte Auswahl, um die 'Details' Eigenschaft zu füllen, dann ist ToList() –

Antwort

1

wie diese versuchen,

Details = DB.OrderDetail.Where(x => x.OrderId == o.Id) 
      .Select(x => new VMOrderEditDetails { 
         Id = x.Id, 
         OrderId = x.OrderId, 
         SparePartName = x.SparePartName, 
         SparePartPrice = x.SparePartPrice.Value, 
         Labor = x.Labor.Value, 
         Total = x.Total.Value, 
         Comment = x.Comment 
        }).ToList() 
+0

Thnak Sie für Ihre Mühe und Zeit. – ysrtymz

+0

Sie sind willkommen :-) – Aruna

+0

@ysrtymz, x.Labor ist Nullable Typ und erfordert x.Labor.Value aber Antwort als oben ohne für .value? – Aruna

0

Details ist ein List<VMOrderEditDetails> Typ, aber sie versuchen, es ein List<OrderDetail> Wert zuweisen, so dass es machen wie diese

Details = DB.VMOrderEditDetails.Where(x => x.OrderId == o.Id).ToList() 
+1

DB.VMOrderEditDetails sicherlich nicht vorhanden, da VMOrderEditDetails ein ist ViewModel-Klasse. –

2

Die DB ein Objekt von OrderDetails kehrt aber die Elemente in der Details Liste Eigenschaft ist vom Typ VMOrderEditDetails ..

Sie müssen konvertieren jedes Element von OrderDetails zu vor dem Zuweisen.

  1. Sie können ein hinzufügen. Select nach der .Where zu diesem Typ vor dem .ToList() in der Zeile mit Ausnahme (siehe Code der Option 2) konvertieren.

    List<VMOrderEdit> OrderEditObj = (from o in DB.Orders 
                join sn in DB.OrderStatusName on o.Status equals sn.Id 
                join st in DB.Storages on o.StorageId equals st.Id 
                join c in DB.Customers on o.CustomerId equals c.Id 
                join d in DB.OrderDetails on o.Id equals d.OrderId into d 
                where o.Id == Id 
                select new VMOrderEdit() 
                { 
                 Id = o.Id, 
                 StorageId = o.StorageId, 
                 //All the other properties 
                 Comment = o.Comment, 
                 Details = d.Select(x => new VMOrderEditDetails{ /*your convertion*/ }).ToList() 
                }).ToList(); 
    
  2. Und weil Sie:

    Details = DB.OrderDetail.Where(x => x.OrderId == o.Id) 
             .Select(x => new VMOrderEditDetails { /* your conversion*/}) 
             .ToList() 
    
  3. Eine bessere Lösung wird eine zusätzliche GroupJoin davor und dann nur noch die Umwandlung in die .Select und nicht auch das Abrufen der Daten hinzuzufügen sein Verwenden Sie Entity Framework eine noch bessere Option ist , um alle join s mit der Verwendung von Navigationseigenschaften zu ersetzen, und dann immer noch die Umwandlung am unteren Rand haben.

+0

Vielen Dank für Efort und Zeit. – ysrtymz

+0

@ysrtymz - Sie sind willkommen :) Hat es Ihnen geholfen, das Problem zu verstehen? –

+0

ja klar. Ich wurde versucht, ein Listenobjekt zu verwenden, das nicht erkannt/aufgerufen/erstellt wurde .. richtig? – ysrtymz

1
DB.OrderDetail 
    .Where(x => x.OrderId == o.Id) 
    .ToList() 

sollte

DB.OrderDetail 
    .Where(x => x.OrderId == o.Id) 
    .Select(x => new VMOrderEditDetails() 
    { 
     Id = x.OrderId 
    }) 
    .ToList<VMOrderEditDetails>() 

als types verschieden sind

+0

Hallo danke und plus .Where Klausel richtig? – ysrtymz

+0

Versäumte Filterklausel; aktualisiert –

2

Your'e eine Liste von OrderDetail zu VMOrderEditDetails zuweisen versuchen, die zum Scheitern verurteilt ist.

Ihre LINQ-Abfrage sollte etwas wie folgt sein. Ich habe die NULL-Prüfung und die Conversions beim Auswählen nicht durchgeführt. Es kann von Ihnen gemacht werden und ist ziemlich einfach. Bitte als Antwort markieren, wenn es hilft.

Details = DB.OrderDetail.Where(x => x.OrderId == o.Id).Select(x=>new VMOrderEditDetails{ 
    Id = x.Id, 
    OrderId = x.OrderId, 
    SparePartName = x.SparePartName, 
    SparePartPrice = x.SparePartPrice, 
    Labor = x.Labor, 
    Total = x.Total, 
    Comment = x.Comment 
}).ToList() 
+0

Thnak Sie für Ihre Mühe und Zeit. – ysrtymz