2015-12-03 11 views
8

Tôi có một truy vấn LINQ to EntitiesTôi có thể sử dụng CAST bên trong truy vấn LINQ to Entities không?

From item In ctx.Items 
Select new { 
    ListPrice = item.Cost/(1M - item.Markup) 
}; 

Tôi có thể chỉ định để EF mà tôi muốn nó để áp dụng một cast với giá niêm yết trước khi truy vấn và thể hóa nó ? Có cái gì đó như EntityFunctions.Cast có thể? Hoặc tôi có thể sử dụng hàm ESQL cast?

Tôi muốn LINQ để tạo ra một truy vấn SQL dọc theo những dòng

SELECT cast((Cost/(1 - Markup)) as decimal(10, 2)) AS ListPrice 

Mục tiêu của tôi là để thoát khỏi một loạt các chính xác/quy mô các truy vấn. Bởi vì có phép trừ thập phân và phân chia, kết quả của phép toán là một số thập phân (38, 26)! Đó là cách nhiều hơn .NET có thể xử lý và nhiều hơn tôi cần.

+0

Bạn không thể sử dụng thành viên 'Chuyển đổi'? –

+0

@AmitKumarGhosh 'Convert.ToDecimal' không được nhận dạng bởi EF –

+1

các chức năng duy nhất tôi biết là từ [SqlFunctions] (https://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions % 28v = vs.110% 29.aspx). Diễn viên của bạn không có mặt trong các chức năng này. – tschmit007

Trả lời

2

EF cho phép bạn ánh xạ các hàm CLR vào các hàm cơ sở dữ liệu bằng cách sử dụng thuộc tính DbFunction. Thật không may, có vẻ như được xây dựng trong castconvert không hoạt động và có vẻ như bạn không thể lập bản đồ cho chúng.

Thay vào đó, bạn có thể tạo UDF làm phép đúc và ánh xạ nó trong DbModel. API ánh xạ phức tạp vì vậy tôi sẽ sử dụng thư viện Code First Functions để làm điều đó cho bạn. (Nếu trước tiên bạn sử dụng Cơ sở dữ liệu hoặc Mô hình, bạn có thể thực hiện ánh xạ theo cách thủ công trong SSDL và CSDL). Ngoài ra, không có cách nào để làm động đúc bên trong một UDF, do đó bạn sẽ cần phải chọn ghi các chức năng riêng biệt cho mỗi diễn viên bạn muốn. Dưới đây là ví dụ về số cast(field as decimal(10,4).

-- In SQL Server 
CREATE FUNCTION ClrRound_10_4 
(
    @value decimal(28, 10) 
) 
RETURNS decimal(10,4) 
AS 
BEGIN 
    DECLARE @converted decimal(10,4) 

    SELECT @converted = cast(round(@value, 4) as decimal(10,4)) 

    RETURN @converted 

END 
GO 
//In your DbContext class 
using CodeFirstStoreFunctions; 

public class MyContext : DbContext { 
    protected override void OnModelCreating(DbModelBuilder builder) { 
     builder.Conventions.Add(new FunctionsConvention("dbo", typeof(Udf)); 
    } 

    //etc 
} 

//In a static class named Udf (in the same namespace as your context) 
using System.Data.Entity; 

public static class Udf { 
    [DbFunction("CodeFirstDatabaseSchema", "ClrRound_10_4")] 
    public static decimal ClrRound_10_4(decimal value) { 
     throw new InvalidOperationException("Cannot call UDF directly!"); 
    } 
} 

//In your LINQ query 
from item in ctx.Items 
select new { 
    ListPrice = Udf.ClrRound_10_4(item.Cost/(1M - item.Markup)) 
}; 

Xem blog post hoặc MSDN bài viết này này để biết thêm chi tiết.

Các vấn đề liên quan