1

Я пытаюсь отобразить значения из 2 таблиц (с использованием кода EF) с использованием SQL JOIN и WHERE.Необработанные SQL-запросы с кодовым кодом EF не работают

Dim query = db.pt.SqlQuery("SELECT p.id, p.name, p.dob, pv.visitId, pv.vDate 
          FROM pt p 
          JOIN pt_v pv ON p.id = pv.id 
          WHERE p.id like @p0 OR p.name like @p1", str1, str2).ToList() 

Я попробовал альтернативный способ. Ниже приведен код:

Dim id = New SqlParameter("@id", str1) 
Dim name = New SqlParameter("@name", str2) 
Dim query As String = "select p.id id, p.name name, p.dob dob, pv.visitId visitId, pv.vDate vDate 
         from pt p 
         join pt_v pv on p.id = pv.id 
         where p.id like @id or p.name like @name" 

Dim Result = db.Database.SqlQuery(Of PtLookupVM)(query, id, name).ToList() 

PtLookupVM мой ViewModel класс, который имеет следующие:

Public Property id As String 
Public Property name As String 
Public Property dob As String 
Public Property visitId As String 
Public Property vDate As String 

Но выход результат для обоих нулевых строк.

Это является выборки данных:

Dim p As New List(Of pt) From { 
     New pt() With {.id = 1, .name = "siti", .dob = "2011-11-17"}, 
     New pt() With {.id = 2, .name = "siti nur", .dob = "2011-12-17"} 
} 

Dim pv As New List(Of pt_v) From { 
     New pt_v() With {.visitId = 1, .id = 1, .vDate = "2016-01-17"}, 
     New pt_v() With {.visitId = 2, .id = 1, .vDate = "2016-05-17"}, 
     New pt_v() With {.visitId = 3, .id = 2, .vDate = "2016-07-17"} 
} 


Dim pList As New List(Of PtLookupVM) From { 
     New PtLookupVM() With {.id = 1, .name = "siti", .dob = "2011-11-17", .visitId = 1, .vDate = "2016-01-17"}, 
     New PtLookupVM() With {.id = 1, .name = "siti", .dob = "2011-11-17", .visitId = 2, .vDate = "2016-05-17"}, 
     New PtLookupVM() With {.id = 2, .name = "siti nur", .dob = "2011-12-17", .visitId = 3, .vDate = "2016-07-17"} 
    } 

Что я пытаюсь получить на самом деле список людей, с именем «Siti». Но я не хочу избыточных значений. Таким образом, он должен только значения на дисплее, как показано ниже:

Это мой ожидается выход:

Dim pList As New List(Of PtLookupVM) From { 
     New PtLookupVM() With {.id = 1, .name = "siti", .dob = "2011-11-17", .visitId = 1, .vDate = "2016-01-17"}, 
     New PtLookupVM() With {.id = 2, .name = "siti nur", .dob = "2011-12-17", .visitId = 3, .vDate = "2016-07-17"} 
} 
+0

Можете ли вы включить образцы данных и ожидаемый результат? Хорошо, что вы используете подготовленное заявление. –

+0

Я не вижу столбец 'id' таблицы' pv', но он используется в фактическом запросе. –

+0

Каковы значения 'str1' и' str2', которые должны соответствовать ** данным образца **? Если вы получаете нулевые записи с ** альтернативным способом **, фильтр не соответствует. Если они совпадают, вы должны получить то, что вы указали в переменной 'pList'. Итак, в конце концов, что вы на самом деле получаете? –

ответ

1

Пусть берут запрос с именованными параметрами (то, что вы называете альтернативный способ). Критерии, используемые в WHERE положение в отношении этих параметров

p.id like @id 

и

p.name like @name 

Как вы можете видеть, нет заполнители используются, так что если вы не предоставите их через параметры, то LIKE будет просто работать как =, таким образом, не будет соответствовать тому, что вы ожидаете, например, например, str2 содержит «sity».

Чтобы соответствовать строке, независимо от позиции внутри целевой области, вы должны окружить значение пользователя с «%»:

Dim id = New SqlParameter("@id", "%" & str1 & "%") 
Dim name = New SqlParameter("@name", "%" & str2 & "%") 

или, если вы предпочитаете первый вариант с неявными параметрами:

Dim query = db.pt.SqlQuery("SELECT p.id, p.name, p.dob, pv.visitId, pv.vDate 
          FROM pt p 
          JOIN pt_v pv ON p.id = pv.id 
          WHERE p.id like @p0 OR p.name like @p1", "%" & str1 & "%", "%" & str2 & "%").ToList()