EF 메타 데이터를 기반으로 동적 쿼리를 구성 할 수 있습니까?
-
22-12-2019 - |
문제
다음 단계로 다음이 가능 해지 여부를 확인하려고합니다.
본질적으로 필드 이름 (문자열) 및 값에서 메커니즘을 만들고 싶습니다. 엔티티의 메타 데이터에서 필드 이름을 동적으로 찾고 해당 정보를 기반으로 LINQ 쿼리를 만듭니다.
단일 테이블에 대해 걱정할 필요가 있으며 테이블의 열은 모두 strings / varchars입니다.
그래서, 예를 들어, 테이블이있는 경우 :
MyTable
-----------------
Field1
Field2
Field3
etc.
.
및이 테이블은 EF에서 생성되었으며 다음과 같이 할 수 있습니다 :
var 결과= CreateDyNamicQuery ( "field3", "내 값");
및 i이를 EF / LINQ 쿼리로 변환 할 수 있습니다.
이 이유가 필요한 이유는 복잡하지만이 경우보다 일반적인 쿼리 메커니즘이 작동하지 않습니다.내가 피하려고하는 것은 문자열 기반 SQL 솔루션입니다.
이이 가능합니다.
해결책
LINQ 표현식 트리 및 엔티티 프레임 워크를 사용하여 쿼리를 작성하는 방법은 간단한 동적 쿼리를 만드는 방법입니다.
public void TestEF()
{
using (DbContext db = new ElFaktura.Data.CustomerEntities())
{
var expr = CreateQuery<Customer>("FirstName", "Lorentz");
var result = db.Set<Customer>().Where(expr);
Debug.Print(result.ToString());
}
}
public Expression<Func<Customer, bool>> CreateQuery<T>(string field, string value)
{
var paramExpr = Expression.Parameter(typeof(T));
var propExpr = Expression.Property(paramExpr, field);
var equalsExpr = Expression.Equal(propExpr, Expression.Constant(value));
return Expression.Lambda<Func<Customer,bool>>(equalsExpr, paramExpr);
}
.
결과 SQL은
입니다.SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Email] AS [Email],
[Extent1].[AddressID] AS [AddressID],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[LastName] AS [LastName]
FROM [dbo].[Customers] AS [Extent1]
WHERE (N'Lorentz' = [Extent1].[FirstName])
. 제휴하지 않습니다 StackOverflow