2010-04-19 4 views
5

Meine IQueryable Linie ist:Linq filtert ein IQueryable <T> (System.Data.Linq.DataQuery) -Objekt von einem List <T> (System.Collection.Generic.List) -Objekt?

// find all timesheets for this period - from db so System.Data.Linq.DataQuery 
var timesheets = _timesheetRepository.FindByPeriod(dte1, dte2); 

Meine Liste Linie ist:

// get my team from AD - from active directory so System.Collection.Generic.List 
var adUsers = _adUserRepository.GetMyTeam(User.Identity.Name); 

ich für die Benutzer in der Zeitenliste Sammlung, um nur Zeiterfassungen wollen, die in der Benutzer Sammlung vorhanden sind.

Wenn ich einen Standard C# Ausdruck verwenden wie:

var teamsheets = from t in timesheets 
        join user in adUsers on t.User1.username equals user.fullname 
        select t; 

erhalte ich die Fehlermeldung „Ein IQueryable, die eine sich selbst verweisende Konstante Ausdruck gibt, wird nicht unterstützt“

Irgendwelche Empfehlungen?

+0

Wie groß sind die Teams? – SteadyEddi

+0

Nicht mehr als 20 Benutzer pro Team wenn das - also .enthalten sollte halten – Klaptrap

Antwort

3

Das Join-Konstrukt wird nicht funktionieren, aber Sie können den Contains Ansatz verwenden. Dieser nächste Ausschnitt könnte den Trick machen.

+0

Gebrochen es - danke – Klaptrap

4

Linq to Sql wird versuchen, eine SQL-Abfrage zu generieren, die den gesamten Ausdruck darstellt. Dies bedeutet, dass versucht wird, die Sammlung der Anzeigenbenutzer als Parameter an eine SQL-Abfrage zu übergeben. Wenn zu viele Benutzer vorhanden sind, trifft die Abfrage das Parameterlimit (2100) und kann nicht ausgeführt werden. Wenn es nicht so viele Benutzer in einem Team gibt, können Sie einen contains-Ausdruck verwenden, der in sql in einen "IN" -Ausdruck konvertiert wird. Diese

ist, was Steven vorgeschlagen hat:

string[] usernames = adUsers.Select(u => u.fullname).ToArray(); 

var teamsheets = 
from t in timesheets 
where usernames.Contains(t.User1.username) 
select t; 

Der einzige Weg, einen in der Art und Weise verbinden zu verwenden, die Sie versucht haben, wäre all die Zeiterfassungen aus der Datenbank in dem Speicher (mit ToList auf dem zum Abrufen Timesheets var), und dann wird der Join im Speicher stattfinden. Wenn diese Leistung besser ist als die Verwendung von Contains oder Sie Contains aufgrund von Teamgrößen nicht verwenden können, ist dies eine Überlegung wert.

+0

Danke für die zusätzliche Erklärung - es macht alles in einem anderen Licht Sinn. – Klaptrap

Verwandte Themen