2013-05-17 14 views
9

Więc mam ten kod:Tylko prymitywne typy lub typy wyliczeniowe są obsługiwane w tym kontekście

public int saleCount(List<Shift> shifts) { 
     var query = (
      from x in database.ItemSales 
      where shifts.Any(y => y.ID == x.shiftID) 
      select x.SalesCount 
     ); 
     return query.Sum(); 
    } 

Niestety, to rzuca ten błąd:

Unable to create a constant value of type 'Shift'. 
Only primitive types or enumeration types are supported in this context. 

więc o to gdzie mogę określić zmiany, które jest po prostu normalnym Kod Entity Framework pierwszego obiektu:

[Table("Shifts")] 
public class Shift : MPropertyAsStringSettable { 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 
    public int SiteID { get; set; } 
    public string ShiftID_In_POS { get; set; } 
    public DateTime ShiftDate { get; set; } 
} 

Chyba problem jest to, że używam Shift, o bject w zapytaniu Linq. I robię operację "Any" na liście "Shift".

Jednym z możliwych rozwiązań jest zmiana listy na kolekcję lub coś podobnego, po prostu ładuję ją zapytaniem linq gdzieś indziej, ale czym byłby podpis?

Odpowiedz

14

Spróbuj zmianę, która nie korzysta z kolekcji Shift s w zapytaniu:

public int saleCount(List<Shift> shifts) { 
    var shiftIds = shifts.Select(s => s.ID).ToList(); 
    var query = (
     from x in database.ItemSales 
     where shiftIds.Contains(x.shiftID) 
     select x.SalesCount 
    ); 
    return query.Sum(); 
} 

Chodzi o to, aby uniknąć przeniesienia Shift obiektów dostawcy zapytania, używając zamiast identyfikatorów.

+0

Yup! Sprawdziło się, miałem zamiar zaproponować zmianę Listy na inny rodzaj kolekcji, ale to jest świetne. – Bill

Powiązane problemy