Hier ist ein Beispiel für die Abfrage, die ich in LINQ konvertieren möchte:
SELECT *
FROM Users
WHERE Users.lastname LIKE '%fra%'
AND Users.Id IN (
SELECT UserId
FROM CompanyRolesToUsers
WHERE CompanyRoleId in (2,3,4) )
Es gibt eine FK-Beziehung zwischen CompanyRolesToUsers
und Users
, aber es ist eine Viele-zu-Viele-Beziehung und es CompanyRolesToUsers
handelt sich um die Kreuzungstabelle.
Wir haben bereits den größten Teil unserer Site erstellt, und wir haben bereits den größten Teil der Filterung, indem wir Ausdrücke mit einer PredicateExtensions-Klasse erstellen.
Der Code für die einfachen Filter sieht ungefähr so aus:
if (!string.IsNullOrEmpty(TextBoxLastName.Text))
{
predicateAnd = predicateAnd.And(c => c.LastName.Contains(
TextBoxLastName.Text.Trim()));
}
e.Result = context.Users.Where(predicateAnd);
Ich versuche, ein Prädikat für eine Unterauswahl in einer anderen Tabelle hinzuzufügen. ( CompanyRolesToUsers
)
Was ich hinzufügen möchte, ist etwas, das dies tut:
int[] selectedRoles = GetSelectedRoles();
if( selectedRoles.Length > 0 )
{
//somehow only select the userid from here ???:
var subquery = from u in CompanyRolesToUsers
where u.RoleID in selectedRoles
select u.UserId;
//somehow transform this into an Expression ???:
var subExpression = Expression.Invoke(subquery);
//and add it on to the existing expressions ???:
predicateAnd = predicateAnd.And(subExpression);
}
Gibt es eine Möglichkeit, dies zu tun? Es ist frustrierend, weil ich die gespeicherte Prozedur leicht schreiben kann, aber ich bin neu in dieser LINQ-Sache und habe eine Frist. Ich konnte kein passendes Beispiel finden, aber ich bin mir sicher, dass es irgendwo da ist.