2016-03-21 22 views
1

Ich versuche, eine Unterabfrage auf meinem Code zu erstellen und konnte eine Unterabfrage erstellen, aber ich kann einige Teile nicht verstehen.linq Unterabfrage Syntax Erklärung

Unten ist die Unterabfrage, die ich gefolgt bin und meine Kommentare zu dem, was ich verstehe.

List<int> IdsToFind = new List<int>() {2, 3, 4}; 
db.Users 
.Where(u => SqlMethods.Like(u.LastName, "%fra%")) 
.Where(u => 
     db.CompanyRolesToUsers // the table inside the subquery 
     .Where(crtu => IdsToFind.Contains(crtu.CompanyRoleId)) //the filter inside the subquery 
     .Select(crtu => crtu.UserId) //I cannot understand why there is a select of column here 
     .Contains(u.Id) //I cannot understand the additional filter here 
) 

Im Folgenden finden Sie die Beispielabfrage der oben LINQ

SELECT * FROM Users WHERE Users.lastname LIKE '%fra%'AND Users.Id IN (
    SELECT UserId 
    FROM CompanyRolesToUsers 
    WHERE CompanyRoleId in (2,3,4)) 

Der Code ist von How to do subquery in linq

PS: ich die Codes von anderen verwendet, so dass ich eine einfache Probe geben könnte meine Frage. Mein Code ist kompliziert. Vielen Dank.

Antwort

1

Sie wählen nur die IDs aus der Unterabfrage aus, da dies alles ist, was Sie brauchen, und dann passen Sie sie dem größeren Satz an.

Dadurch werden alle zusätzlichen Daten verworfen, die Sie nicht benötigen. Es tut genau dasselbe wie SELECT UserId

.Contains(u.Id) 

Dadurch wird die Unterabfrage zu beschränken, um nur Einträge, die in der Liste sind für durchsucht. Es ist analog zu WHERE CompanyRoleId in (2,3,4)) im Original.

Lassen Sie mich wissen, wenn irgendein Teil davon mehr Klärung benötigt, und ich kann versuchen, mehr zu helfen.

+0

Vielen Dank, dass war eine dumme Frage, die ich schließlich realisiert, dass das 'wo' war für die Fremdschlüssel und die' select' und 'contain' sind für Filter. – makoto