При написании эквивалентного запроса LINQ в DbContext с использованием Reflection отсутствует условие where - PullRequest
1 голос
/ 17 апреля 2019

Я не могу создать эквивалентный запрос в отражении запроса LINQ.

Цель состоит в том, чтобы выполнить запрос к DBContext Entity Framework, но указать имя таблицы и предложение where. Существует несколько таблиц, поэтому я не хочу копировать / вставлять один и тот же LINQ для разных таблиц.

Приведенный ниже код работает с LINQ, но эквивалент отражения (хотя я приводил его к System.Linq.IQueryable), не позволяет мне добавить предложение .where.

Я включил using System.Linq; в класс.

Примеры, которые я исследовал из stackoverflow, предоставляют предложение Where ().

Это, вероятно, что-то незначительное, что я пропускаю. (отсутствует ссылка?)

        // Link to TREESTRUCTURES Database
        var DaContext = new WebApplication7.Models.Db_Entities.TREE_STRUCTURESEntities();
        DaContext.Database.CommandTimeout=300;

        // This works 100% for "HEADCOUNT_NEW"
        var daTreeLeaves = DaContext.HEADCOUNT_NEW
            .Where(x => x.PARENT_COMPONENT == "" && x.COMPONENT_DESCRIPTION == "Headcounts")
            .Select(x => new { x.COMPONENT, x.COMPONENT_DESCRIPTION })
            .OrderBy(x => x.COMPONENT)
            .ToList();

        // Reflections! = This works - Selecting from "HEADCOUNT_NEW" or any other specified available table;
        PropertyInfo dbsetinfo = DaContext.GetType().GetProperties().FirstOrDefault(p => p.Name.ToUpper().Equals("HEADCOUNT_NEW"));

        // I can't seem to get the `.Where()` clause right here (although this code  does return values :) )
        // I omitted the Where here as it would not compile.
        System.Linq.IQueryable anyDbSet = ((IQueryable)dbsetinfo.GetValue(DaContext));

        // Below is my attempt (pseudocode), but the error 
        // "IQueryable does not contain a definition for Where" is returned by VStudio
        System.Linq.IQueryable anyDbSet2 = ((IQueryable)dbsetinfo.GetValue(DaContext)).Where("Id=" + pseudocode);

1 Ответ

1 голос
/ 17 апреля 2019

Вам необходимо привести к IQueryable<HEADCOUNT_NEW>

Where - это метод расширения, который работает на IQueryable<T>, а не IQueryable.

...