【发布时间】:2019-09-03 21:14:02
【问题描述】:
我需要使用大于语句针对 Guid/UniqueIdentifier 列生成 where 子句。我的问题是我必须动态生成查询。这是我想要的一个例子:
myTable.Where(x => Guid.Empty.CompareTo(x.ADifferentGuidColumn) > 0)
生成此 SQL(我在这里使用 LINQPad 获取 SQL):
-- Region Parameters
DECLARE @p0 UniqueIdentifier = '00000000-0000-0000-0000-000000000000'
-- EndRegion
SELECT <columns...>
FROM [myTable] AS [t0]
WHERE (@p0 > [t0].[ADifferentGuidColumn])
这就是我所拥有的。这是一个更大的通用方法,其中T 参数是表/域模型对象。它可以编译,但是在创建 startPointBody 说 The binary operator GreaterThan is not defined for the types 'System.Guid' and 'System.Guid'. 时会爆炸
Guid startPoint = Guid.NewGuid(); //actual value in real code...
IQueryable<T> set = context.Set<T>().AsQueryable();
var parameter = Expression.Parameter(typeof(T), "x");
//find primary key
IProperty primaryKey = context.Model.FindEntityType(typeof(T).FullName).FindPrimaryKey().Properties.FirstOrDefault();
//expression for column we're filtering
var startPointMember = Expression.Property(parameter, primaryKey.Name);
ConstantExpression startPointConstant = Expression.Constant(startPoint, startPoint.GetType());
var startPointBody = Expression.GreaterThan(startPointMember, startPointConstant);
var startPointWhereExpression = Expression.Lambda<Func<T, bool>>(startPointBody, parameter);
query = query.Where(startPointWhereExpression);
您可以在我想要的示例中看到我实际上正在使用Guid.CompareTo(),但我不知道如何以这种动态方式编写它。我希望我可以作弊,因为生成的 SQL 只是做一个简单的> 比较,但 EF 抓住了我。
【问题讨论】:
-
我正在为您在这里尝试做的事情而苦苦挣扎。你是说你事先不知道你会
SELECTing 反对哪张桌子?这就是为什么需要动态查询的原因? -
是的,我不知道桌子是什么,因此是动态的东西。它已经运行了几个星期了。我今天需要添加这个 where 子句并遇到了这堵墙,因为
>不存在/没有为 Guid 类型实现。 -
我要走出公寓去吃点东西,然后细细咀嚼,但是是否可以只为 Guid 类型实现 GreaterThan?
标签: c# entity-framework entity-framework-core