Linq In Clause & Predicate здание - PullRequest
0 голосов
/ 18 мая 2010

У меня есть две таблицы. Отчет и Данные отчета . ReportData имеет ограничение ReportID.

Как мне написать свой запрос linq, чтобы он возвращал все объекты отчета, для которых выполняются условия предиката для ReportData? Примерно так в SQL:

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

Вот как я строю свой предикат:

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();

Это моя конструкция запроса на данный момент:

    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;
    }

Я также пытался сделать следующее: public override IQueryable GetReports (выражение> предикат, LLReportsDataContext reportDC) { if (reportDC == null) генерирует новое исключение 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;
    }

Однако я получаю следующее исключение: «Неподдерживаемая перегрузка, используемая для оператора запроса« Где ».»

UPDATE Это исправлено:

        var q = reportDC.Reports.AsExpandable().
            Where(r => r.ReportDatas.Any(predicate.Compile()))
            .Where(r => r.ServiceID.Equals(1));

1 Ответ

1 голос
/ 18 мая 2010

Запрос

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

AboutLinqKit

При использовании LinqKit иногда необходимо вызвать AsExpandable() в коллекции сущностей и скомпилировать выражение предиката. см. пример

...