Использование sql запросов в EF - PullRequest
0 голосов
/ 04 мая 2018

Я получаю данные из базы данных следующим образом:

 result = (from d in context.FTDocuments
                          join f in context.FTDocFlags on d.ID equals f.DocID into fgrp
                          from x in fgrp.DefaultIfEmpty()
                          where d.LevelID == levelID && x.UserID == userID && d.Status.Equals(DocumentStatus.NEW)
                          select new Entities.Document
                          {
                              ArrivalDate = d.ArrivalDate.Value,
                              BundleReference = d.BundleRef,
                              CreatedDate = d.CreatedDate,
                              CustomerID = d.CustomerID,
                              DocType = d.DocType.Value,
                              GuidID = d.DocGuid,
                              ID = d.ID,
                              LastExportID = d.LastExpID,
                              LevelID = d.LevelID,
                              ProfileID = d.ProfileID,
                              ScanDate = d.ScanDate.Value,
                              ScanOperator = d.ScanOperator,
                              SenderEmail = d.SenderEmail,
                              Status = d.Status,
                              VerifyOperator = d.VerOperator,
                              FlagNo = x == null ? 0 : x.FlagNo,
                              FlagUserID = x == null ? 0 : x.UserID
                          }).ToList();

Теперь я пытаюсь добиться этого с помощью SQL-запросов:

var test = context.Database.SqlQuery<string>("select *from FTDocument d left outer join FTDocFlag f on d.ID=f.DocID").ToList();

Но получите следующую ошибку:

Считыватель данных имеет более одного поля. Несколько полей недопустимы для примитивов EDM или типов перечисления

Можно ли использовать сложные запросы, как указано выше?

Я использую EF 6.0.

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

попробуйте

const string query = @"select *from FTDocument d left outer join FTDocFlag f on d.ID=f.DocID";

var test = context.Database.SqlQuery<Entity>(query).ToList();
0 голосов
/ 04 мая 2018

В своем ответе я предположил EntitityFramework (ObjectContext) сначала, но затем я также добавил код для DbContext .

Чтобы проверить приведенный ниже пример, вы можете использовать LinqPad и добавить свою DLL-библиотеку Entity Framework с помощью EntitityFramework (ObjectContext) через Добавить соединение. Указать соединение Свойства и закройте диалог подключения. Затем выберите соединение и запустите пример:

void Main()
{
    var context=this; // requires that you selected an EF ObjectContext connection  
    var q=context.ExecuteStoreQuery<FTDocument>(
                                   "SELECT * FROM FTDocument WHERE ID = @p0", 1);
    q.ToList().Dump();
}

Он будет принимать все виды запросов SQL, и вы можете использовать такие параметры, как @p0, @p1 и т. Д., И просто добавлять их через запятую при вызове функции ExecuteStoreQuery. Результат будет возвращен как List<FTDocument>. Чтобы преобразовать его в List<string>, вам нужно указать, какое поле базы данных вы хотите вернуть - или вы создаете разделенный запятыми список значений полей в каждой строке, например:

    q.Select(s=>s.ID+", "+s.GuidID+", "+s.DocType).ToList().Dump();

Тот же пример, но на этот раз с EntityFramework (DbContext) :

Добавьте свою библиотеку Entity Framework с помощью EntitityFramework (DbContext V4 / V5 / V6) через Добавить подключение. Укажите свойства подключения (не забудьте указать файл AppConfig) и закройте диалог подключения. Затем выберите соединение и запустите пример:

void Main()
{
    var context=this; // requires that you selected an EF DBContext (V4/5/6) connection 
    var q=context.Database.SqlQuery<FTDocument>(
                               "SELECT * FROM FTDocument WHERE ID = @p0", 1);
    q.ToList().Dump();
}

Совет: Прежде чем закрыть диалоговое окно подключения, нажмите Тест . Это избавит вас от головной боли позже, если вы знаете, что соединение успешно установлено. Для всех тех, кто хочет опробовать его в другом проекте EF с собственной базой данных, представляет собой краткое руководство по его созданию. Затем просто замените FTDocument в приведенном выше примере на другую таблицу по вашему выбору (в строке SQL и внутри скобок <...>, конечно).

0 голосов
/ 04 мая 2018

ваш запрос не возвращает ни одной строки. Используйте как:

var test = context.Database.SqlQuery<Entities.Document>("...");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...