«LINQ to Entities не распознает метод» без использования локальных - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу запросить количество выбранных продуктов с помощью Combobox в VB.NET, Linq и Entity Framework 6. Этот запрос генерирует ошибку (cmbProducts - Combobox):

    Dim Count = (From Product In db.Products
                 Where Product.Type = cmbProducts.SelectedValue
                ).Count

И это ошибка:

LINQ to Entities does not recognize the method 'System.Object CompareObjectEqual(System.Object, System.Object, Boolean)' method, and this method cannot be translated into a store expression.

Но когда я запускаю этот запрос с db.Products.local , он выполняется без ошибок:

    Dim Count = (From Product In db.Products.local
                 Where Product.Type = cmbProducts.SelectedValue
                ).Count

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вам действительно следует включить Option Strict On в свойствах проекта, а также в параметрах IDE, поэтому для всех будущих проектов это будет On по умолчанию. Если вы сделаете это, то этот код даже не скомпилируется. Это заставит вас поступить так, как вы должны, и приведете SelectedValue, который является типом Object, к фактическому типу базового объекта, который предположительно равен String или Integer. Вы можете использовать DirectCast или CInt, CStr или подобное для выполнения приведения, например

Where Product.Type = CInt(cmbProducts.SelectedValue)

В идеале вы должны присваивать результат этого приведения переменной и использовать его в своем запросе LINQ. Важно помнить, что, хотя синтаксис LINQ всегда одинаков, каждый поставщик LINQ имеет свою реализацию. LINQ to Entities преобразует ваш запрос в SQL, который он может выполнить в отношении базы данных, и это означает, что некоторые вещи, которые поддерживаются LINQ в целом и, таким образом, будут компилироваться, фактически не будут выполняться во время выполнения для LINQ to Entities. Как правило, это хорошая идея - держать что-нибудь экзотическое в своих EF-запросах. В этом случае вы, вероятно, будете в порядке, но это хорошая привычка, так как это поможет избежать тонких проблем.

0 голосов
/ 14 ноября 2018

Убедитесь, что они одного типа.

Я думаю, Product.Type является строкой, но cmbProducts.SelectedValue является int, попробуйте использовать cmbProducts.SelectedItem.Text

При локальном сравнении .Net сможет сравнивать их с помощью SQL Serverне может.

...