Frage

Ich bin mit einem ähnlichen Ansatz wie andere in meinen LINQ Objekte in meinen LINQ-Datenprovider zu halten und ein IQueryable Rückkehr zur Filterung usw. erlaube Dies funktioniert ein einfaches Objekt zum Filtern durch seine ID oder eine andere Eigenschaft, aber ich habe eine Problem mit einem Tabellenobjekt verbinden, die von anderen untergeordneten Objekten

zusammengesetzt ist
    //CoreDBDataContext db = coreDB;
public IQueryable<DTO.Position> GetPositions()    {
     return from p in coreDB.Positions
         select new DTO.Position
             {
             DTO.User = new DTO.User(p.User.id,p.User.username, p.User.firstName,p.User.lastName,p.User.email,p.User.isActive),
             DTO.Role = new DTO.Role(p.Role.id, p.Role.name, p.Role.isActive),
             DTO.OrgUnit = new DTO.OrgUnit(p.OrgUnit.id,p.OrgUnit.name,p.OrgUnit.isActive)
             };

Die coreDB.Positions ist meine Linq Position Objekt und ich bin ein DTO Position zurückkehrt, die aus einem Benutzer zusammengesetzt ist, OrgUnit und Rolle (die zugrunde liegende Tabelle ist eine Join-Tabelle mit Benutzer-ID, RoleID und OrgUnitID)

Das Problem, das ich habe ist, dass wenn ich versuche, einen Filter hinzuzufügen, auf dem IQueryable ich einen SQL-Fehler erhalten, dass es keine Übersetzung für mein DTO.User Objekt verfügbar ist

public static IQueryable<Position> WithUserID(this IQueryable<Position> query, int userID)
    {
        return query.Where(p => p.User.ID == userID);
    }

Ich bin bei einem vollständigen Verlust, wie diese gehen über die Lösung, wie alle meine Google Ergebnisse scheinen mit Menschen zu sein, direkt mit den generierten LINQ Objekten arbeiten

Jeder Gedanke, wie diese Arbeit zu machen, oder bin ich etwas ganz falsch hier?

Danke

War es hilfreich?

Lösung 3

ich am Ende nicht Filter für meine komplexen Abfragen. Stattdessen habe ich Methoden in das Repository für die komplexeren Abfrage Anforderungen. Ich empfinde dies wird das System einfacher zu verstehen und daher beibehalten.

Andere Tipps

Ich konnte erfolgreich mit einem ähnlichen Ansatz arbeiten:

var courses = from c in Map(origCourses)
where !expiredStatuses.Contains(c.Status)
select c;

Wo Karte hat:

    select new UserCourseListItem
    {
        CourseID = c.CourseID,
        CourseName = cm.CourseName,
        CourseType = c.CourseType.Value
        ...

Wie wäre es mit dieser Art von Initialisierung (anstelle von Konstrukteuren) versuchen.

Ps. dieser Teil einer Arbeits Anwendung ist und die expiredStatuses ist sogar zu einem komplexen Ausdruck verknüpft.

Update 1: Dies ist ähnlich im Vergleich zu dem genannten Szenario, denn:

  • Karte ist eine IQueryable Rückkehr, die ein POCO-Objekt ist.
  • Nach der Map-Methode aufrufen, die eine IQueryable mit dem POCO-Objekt zurückgibt ich einen Filter gegen sie beantrage.

Linq2SQL versteht nur die Designer generierten Objekte. Nun, das ist nicht ganz richtig, aber nahe genug.

So

, wenn Sie schreiben Linq agains Linq2SQL Objekte abfragt, wird die Abfrage auf gültige SQL umgewandelt werden, wenn die Abfrage tatsächlich ausgeführt wird, nicht, wenn es geschrieben ist. Da Ihre DTO Objekte nicht Linq2SQL Objekte sind, wird Linq2SQL nicht wissen, wie die richtige SQL erstellen.

Wenn Sie Ihre Trennung auf diese Weise halten wollen, müssen Sie einen Weg finden, Ihre Fragen mit auszuführen nur Linq2SQL beteiligten Objekte und Karte nur das Ergebnis zu Ihrer DTOs.

Vielleicht könnten Sie umschreiben Ihre Abfrage-Methode:

  

Update: Parameter muss vom Typ sein   Expression<>, und es gibt keine Notwendigkeit,   Rückkehr eine IQueryable<>. Dank an   Freddy für den Hinweis auf.

public IEnumerable<DTO.Position> FindPositions(Expression<Func<Position, bool>> criteria)
{
    return from p in coreDB.Positions
           where criteria.Invoke(p)
           select new DTO.Position
                      {
                          User = new DTO.User(p.User.id, p.User.username, p.User.firstName, p.User.lastName,
                                       p.User.email, p.User.isActive),
                          Role = new DTO.Role(p.Role.id, p.Role.name, p.Role.isActive),
                          OrgUnit = new DTO.OrgUnit(p.OrgUnit.id, p.OrgUnit.name, p.OrgUnit.isActive)
                      };
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top