Как использовать метод расширения System.Linq в проекте VB.NET с Option Strict ON - PullRequest
2 голосов
/ 02 февраля 2011

Я использую .NET 3.5 В моем классе DataLayer у меня есть ссылки на System.Core, System.Data.Linq, System.Data.DataSetExtensions.Но я не могу использовать эту функцию в запросе Linq, если у меня Option Strict ON :

    Dim query = From st In db.Students _
         From c In db.Countries.Where(Function(c) c.Id = st.CountryId).DefaultIfEmpty _
         From r In db.Rooms.Where(Function(r) r.Id = st.RoomId).DefaultIfEmpty _
         From b In db.Buildings.Where(Function(b) b.Id = r.BuildingId).DefaultIfEmpty _
         From es In db.Essays.Where(Function(es) es.StudentId = st.Id).DefaultIfEmpty _
         Select st.Id, st.FullName, c.CountryName, r.RoomNumber, b.BuildingName, es.Eassay

Это приведет к следующей ошибке:

Overload resolution failed because no accessible 'Where' can be called with these arguments:
    Extension method 'Public Function Where(predicate As System.Linq.Expressions.Expression(Of System.Func(Of Country, Integer, Boolean))) As System.Linq.IQueryable(Of Country)'

defined in 'System.Linq.Queryable': Nested function does not have the same signature as delegate 'System.Func(Of Country, Integer, Boolean)'.

Extension method 'Public Function Where(predicate As System.Linq.Expressions.Expression(Of System.Func(Of Country, Boolean))) As System.Linq.IQueryable(Of Country)' defined in 'System.Linq.Queryable': Option Strict On disallows implicit conversions from 'Boolean?' to 'Boolean'.
    Extension method 'Public Function Where(predicate As System.Func(Of Country, Integer, Boolean)) As System.Collections.Generic.IEnumerable(Of Country)' defined in 'System.Linq.Enumerable': Nested function does not have the same signature as delegate 'System.Func(Of Country, Integer, Boolean)'.
    Extension method 'Public Function Where(predicate As System.Func(Of Country, Boolean)) As System.Collections.Generic.IEnumerable(Of Country)' defined in 'System.Linq.Enumerable': Option Strict On disallows implicit conversions from 'Boolean?' to 'Boolean'..........

"Где«Предложение является членом System.Linq.Queryable

Открытая общая функция Where (из TSource) (Источник ByVal как System.Linq.IQueryable (Of TSource), предикат ByVal как System.Linq.Expressions.Выражение (Of System.Func (Of TSource, Boolean))) Как System.Linq.IQueryable (Of TSource)

И «DefaultIfEmpty» является членом System.Linq.Queryable

Общедоступная общая функция DefaultIfEmpty (Of TSource) (Источник ByVal как System.Linq.IQueryable (Of TSource)) Как System.Linq.IQueryable (Of TSource)

Если я установил Option Strict OFF , проблем нет .

Как использовать эти методы расширения System.Linq в проекте VB.NET с Option Strict ON?Спасибо

1 Ответ

5 голосов
/ 02 февраля 2011

Похоже, что CountryId является типом значения, допускающим значение NULL, поэтому

c.CountryId = st.CountryId

будет логическим значением NULL, а не обычным логическим значением.

Попробуйте что-то вроде этого

From st In db.Students _
From c In db.Countries.Where(Function(c) If(c.CountryId = st.CountryId, False)) _
Select st.FirstName, c.CountryName

Кстати, похоже, вы ищете группу , присоединяйтесь в любом случае:

From s In db.Students
Group Join c In db.Countries On s.CountryID Equals c.CountryID Into Group
From g In Group.DefaultIfEmpty
Select New With {.Name = s.Name, .CountryName = If(g IsNot Nothing, g.CountryName, "")}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...