2012-04-03 10 views
1

Ich bekomme Linq to Sql has no supported translation to SQL in der Zeile unten. Vielleicht könnte jemand erklären, wie das gelöst werden kann?Linq zu Sql hat keine unterstützte Übersetzung zu SQL

UsersCount = _repository.GetUsers(p.Id).Count() 

Voll Code

public IQueryable<ProductViewModel> Build() 
{ 
return _repository.GetProducts(true).Select(p=> new ProductViewModel 
    { 
    Id = p.Id, 
    Name = p.Name, 
    UsersCount = _repository.GetUsers(p.Id).Count() 
    });   
} 


public IQueryable<User> GetUsers(int productId) 
{ 
    return _db.Orders.Where(p => p.ProductId == productId) 
        .SelectMany(t1 => _db.Users.Where(x => x.Id == t1.UserId) 
        .DefaultIfEmpty(), (order, user) => user);    
} 

Antwort

0

Etwas ist mit Ihrer Funktion nicht korrekt. Die gibt null zurück, wenn kein Benutzer vorhanden ist, weil Sie DefaultIfEmpty() verwenden. Das zeigt an, dass Sie eine left join machen möchten. Aber die Funktion gibt Benutzer zurück. So könnte dies eine Möglichkeit für Sie sein:

public IQueryable<User> GetUsers(int productId) 
{ 
    return (
     from o in _db.Orders 
     from u in _db.User.Where(a=>a.Id==o.UserId).DefaultIfEmpty() 
     where o.ProductId==productId 
     select u 
    ); 
} 

Ich würde erwarten, dass eine Funktion Benutzer zurückgeben, wenn GetUsers aufgerufen wird. So etwas wie dieses dann:

public IQueryable<User> GetUsers(int productId) 
{ 
    return (
     from o in _db.Orders 
     join u in _db.User 
      on o.UserId equals u.Id 
     where o.ProductId==productId 
     select u 
    ); 
} 

Oder wenn Aufträge eine Eins-zu viele Tisch und Sie wollen einzelne Nutzer. Dann etwas wie das:

Ich bin nicht wirklich sicher, was Sie wollen. Aber ich hoffe, das wird helfen

0

Code ist nicht klar, aber es sieht aus wie Sie versuchen, LINQ2SQL verwenden, wie Sie SQL verwenden würde und nicht auf LINQ2SQL angewiesen, um die Joins für Sie zu tun. Hauptverwirrung hier ist GetUsers Methode, von der ich vermute, dass Benutzer für gegebene Reihenfolge auf gegebener Produkt-ID zurückgeben sollte. Wenn ich immer sollte es korrigieren diese Methode aussehen wie folgt aus:

public IQueryable<User> GetUsers(int productId) 
{ 
    IQueryable<User> users = from order in _db.Orders 
          where order.ProductId == productId 
          select order.users; 
    return users; 
} 

Dazu Sie arbeiten müssen Sie Datenbank und importiert in DBML Dateidefinitionen zusammen mit allen Tabelle definierten Tabellenbeziehungen haben. Das Definieren von Beziehungen in DB (also in LINQ2SQL) ist ein viel besserer Ansatz, als sie bei jeder Abfrage im Code anzugeben. Ihre LINQ-Abfragen werden viel einfacher. Und es hilft, die Datenintegrität der Datenbank zu erhalten.