Question

J'ai deux tables. Rapport et ReportData.ReportData a une contrainte ReportID.

Comment puis-je écrire ma requête linq pour retourner tous les objets de Rapport où le prédicat conditions sont réunies pour ReportData?Quelque chose comme cela en SQL:

SELECT * FROM Report as r
Where r.ServiceID = 3 and r.ReportID IN (Select ReportID FROM ReportData WHERE JobID LIKE 'Something%')

C'est de cette façon que je suis en train de construire mon prédicat:

Expression<Func<ReportData, bool>> predicate = PredicateBuilder.True<ReportData>();
predicate = predicate.And(x => x.JobID.StartsWith(QueryConfig.Instance.DataStreamName));

var q = engine.GetReports(predicate, reportsDataContext);
reports = q.ToList();

C'est ma requête de la construction à l'instant:

    public override IQueryable<Report> GetReports(Expression<Func<ReportData, bool>> predicate, LLReportsDataContext reportDC)
    {
        if (reportDC == null) throw new ArgumentNullException("reportDC");

        var q = reportDC.ReportDatas.Where(predicate).Where(r => r.ServiceID.Equals(1)).Select(r => r.Report);
        return q;
    }

J'ai essayé de faire le suivant ainsi:public override IQueryable GetReports(Expression> prédicat, LLReportsDataContext reportDC) { si (reportDC == null) throw new ArgumentNullException("reportDC");

        var q = from r in reportDC.Reports
                where r.ServiceID.Equals(1)
                where r.ReportDatas.Where(predicate.Compile()).Select(x => r.ReportID).Contains(r.ReportID)
                select r;
        return q;
    }

Cependant, j'ai cette Exception:"Non pris en charge surcharge utilisé pour l'opérateur de requête "Où"."

Mise à JOUR Ce qu'il est corrigé:

        var q = reportDC.Reports.AsExpandable().
            Where(r => r.ReportDatas.Any(predicate.Compile()))
            .Where(r => r.ServiceID.Equals(1));
Était-ce utile?

La solution

Requête

ReportDatas
.Where( reportData => reportData.StartsWith( "Something%" ) &&
     reportData.Report.Id ==3)
.Select( reportData => reportData.Report )
.Distinct()

AboutLinqKit

Lors de l'utilisation de LinqKit, parfois, vous devez appeler AsExpandable() dans l'entité de collecte et de compiler l'expression de prédicat.voir cet exemple :): comment-utiliser-prédicat-builder-avec-linq2sql-et-ou-opérateur

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top