Вопрос по c#, entity-framework – Можно ли сделать функции уровня SQL доступными для запросов LINQ to Entity?

2

Я хотел бы написать LINQ для запросов сущностей, которые вызывали другие функции:

from c in context.Widgets
where MyFunc(c.name)
select c

Это вызывает ошибку, потому что выражение, очевидно, не может быть преобразовано в TSQL, который вызывает MyFunc.

Ну, я думаю, разве что MyFunc не был либо пользовательской функцией, либо (я думаю, еще лучше) функцией SQL / CLR.

Так возможно ли это и более того рекомендуется?

Если это невозможно, будет ли мое желание сделать эту функцию действительной и, возможно, будет решено в будущем ADO.NET?

Ваш Ответ

2   ответа
3

Вы должны создать пользовательскую функциюMyFunc в базе данных и & quot; импортировать & quot; это вручную в ваш контекст (edmx, поэтому сначала база данных), как в XML, так и в виде заглушки в частичном классе вне класса контекста. Процедура описана здесь:

Как использовать пользовательскую функцию базы данных (Обратите внимание, что «StorageNamespace» - это пространство имен, которое вы найдете в файле XML в разделе<edmx:StorageModels><Schema Namespace=....

MSDN имеет похожее описание.

0

EF ориентирован на синхронизацию классов .net со структурой базы данных и лучше всего подходит там, где база данных тупа и вся логика находится в классах.

Но вы можете сопоставить функции и хранимые процедуры - это немного техническое объяснение (намного проще) - позвольте мне найти несколько ссылок для вас.

Here's a bad way to do it:

// Query that calls the OrderTotal function to recalculate the order total.
string queryString = @"USING Microsoft.Samples.Entity;
    FUNCTION OrderTotal(o SalesOrderHeader) AS
    (o.SubTotal + o.TaxAmt + o.Freight)

    SELECT [order].TotalDue AS currentTotal, OrderTotal([order]) AS calculated
    FROM AdventureWorksEntities.SalesOrderHeaders AS [order]
    WHERE [order].Contact.ContactID = @customer";

int customerId = 364;


using (AdventureWorksEntities context =
    new AdventureWorksEntities())
{
    ObjectQuery<DbDataRecord> query = new ObjectQuery<DbDataRecord>(queryString, context);
    query.Parameters.Add(new ObjectParameter("customer",customerId));

    foreach (DbDataRecord rec in query)
    {
        Console.WriteLine("Order Total: Current - {0}, Calculated - {1}.", 
            rec[0], rec[1]);
    }
}

http://msdn.microsoft.com/en-us/library/dd490951.aspx

An here's how to do it properly:

http://scipbe.wordpress.com/2010/08/30/stored-procedures-udfs-in-the-entity-framework-part-1/

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