Linq К проблеме SQL - не имеет никакого поддерживаемого перевода в SQL (проблема со свойством C#)

Я расширяю некоторый Linq до классов SQL. У меня есть 2 подобных оператора, 1-е работы, 2-е не делает ("не имеет никакого поддерживаемого перевода в SQL" ошибка).

var reg2 = rs.ProductRegistrations().SingleOrDefault(p => p.Product.product_name == "ACE")

var reg5 = rs.ProductRegistrations().SingleOrDefault(p => p.product_name == "ACE");

После чтения этой ссылки LINQ: Никакой Перевод в SQL

Я понимаю (я думаю), это в основном все должно быть "встроено", иначе дерево выражений не может быть вычислено правильно. 1-й пример непосредственно получает доступ к "продукту" LinqToSql EntitySet (сохраняющий все встроенное), тогда как 2-й пример использует свойство, которое определяется как это:

public partial class ProductRegistration :IProduct
{
    public string product_name
    {
        get { return this.Product.product_name; }
    }
}

Я предполагаю, что моя проблема состоит в том, что LinqToSql не может перевести это.

Как я повернул бы "свойство" в эквивалентный оператор? Я знаю, что должен использовать Систему. Linq. Выражения. Выражение, но все, что я попробовал, не работает (некоторые даже не компилируют). Возможно, я должен сделать Дополнительный метод (использующий Выражение) и затем назвать это от свойства? Свойство может назвать дополнительный метод??

Вещи как ниже не работают:

public static System.Linq.Expressions.Expression> ProductName2 (string pname)
{
    return (p => p.product_name == pname);
}

Нижняя строка, я знаю, что должен перенести свой метод доступа в "Выражение <....>", но я не знаю, как получить доступ к этому от свойства, так, чтобы "reg5" переменная выше работала правильно.

Было бы большим, если бы был некоторый волшебный атрибут, что я мог просто добавить к свойству к "автовыражению" свойство и сделать LinqToSql счастливым, вместо того, чтобы перенести его в Выражение <...>

Хотел бы смочь сделать это...

public partial class ProductRegistration :IProduct
{
    [Auto-Expression]
    public string product_name
    {
        get { return this.Product.product_name; }
    }
}

ОТРЕДАКТИРУЙТЕ ссылку и ответ ниже работ. Потрясающий, спасибо. 2-я часть моего вопроса, снова у меня есть 2 подобных оператора, 1-е работы, 2-е не делает ("не имеет никакого поддерживаемого перевода в SQL" ошибка).

var reg = rs.ProductRegistrations().ProductName("ACE").WithTranslations().SingleOrDefault();

var reg2 = rs.ProductRegistrations2().ProductName("ACE").WithTranslations().SingleOrDefault();

Различие в них - то, что 1-й возвращает IQueryable реального класса "IQueryable[ProductRegistration]", тогда как 2-й возвращает IQueryable интерфейса "IQueryable [IProduct]". Я хотел бы использовать 2-й, потому что я могу хлопнуть интерфейс через многие различные классы, и это более универсально тот путь, но это, кажется, не работает. Какие-либо идеи?

14
задан Community 23 May 2017 в 12:07
поделиться

1 ответ

Было бы здорово, если бы был какой-то магический атрибут, который я мог бы просто добавить к свойству для "авто-выражения" свойства и осчастливить LinqToSql вместо завернув его в Expression <...>

Да, почти.Вам все равно придется проделать некоторую работу, но Damien Guard и друзья сделали за вас самую сложную часть: Свойства на стороне клиента и любой удаленный поставщик LINQ

Замечательно то, что работает с любым поставщиком LINQ, который поддерживает используемые вами выражения.

Обновление: Проблема с вашей второй версией (с интерфейсом) заключается в том, что поставщик Queryable должен иметь возможность выяснить, что является разработчиком интерфейса, потому что ему необходимо транслитерировать это в имя таблицы. . Но вся суть интерфейса в том, что пользователь интерфейса должен быть независимым от типа реализации, чтобы поставщик работал в перекрестных целях с интерфейсом. Так что я не думаю, что вторая форма сработает.

10
ответ дан 1 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: