- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
首先:我们不做 TPH(每个层次结构的表),这会使事情变得简单得多。
我有大约 20 个 POCO,它们在某些情况下都具有相似的属性。我关心的类似属性是 ___.CreatedDate
和 ___.UpdatedDate
.对于某些 POCO,UpdatedDate
没有意义,所以他们没有那个属性(property)。 CreatedDate
将永远存在,UpdatedDate
可能为空。有时还有第三个字段。
无论我查询的是 20 个 POCO 中的哪一个,从数据库中检索对象的查询看起来总是一样的。但是,该查询被重复了 20 次,每个对象对应一种类型。我能够将检索部分分解为扩展方法(关闭 IDbSet<T>
)以进行初始查找和连接,将日期范围过滤留给消费者作为练习。我现在想将 20 个看起来几乎相同的日期范围过滤器合并为一个,但遇到了查询理解方面的问题。
根据 POCO,日期过滤逻辑是应该检查 UpdatedDate 并将其值与阈值进行比较。如果 UpdatedDate 为 null(或属性不存在),则应改用 CreatedDate。
我首先在每个 POCO 上创建一个静态属性 getter,我将其命名为“DateFields”。它的类型为 IEnumerable<Expression<Func<T, DateTime?>>>
看起来像这样:
get
{
yield return x => x.UpdatedDate;
yield return x => x.CreatedDate;
yield return x => x.Date;
}
这些字段按照我希望它们被检查的顺序返回,并且对于每个 POCO 都是唯一的。
然后我创建了一个谓词来根据高低范围检查每个值:
public static bool DatesBetween<T> (T value, IEnumerable<Expression<Func<T, DateTime?>>> dates, DateTime? dateFrom, DateTime? dateTo)
{
var firstDate = dates
.Select(expression => expression.Compile())
.FirstOrDefault(func => func(value) != null);
if (firstDate == null)
return false;
var minDate = dateFrom.GetValueOrDefault(SqlDateTime.MinValue.Value);
var maxDate = dateTo.GetValueOrDefault(SqlDateTime.MaxValue.Value);
var actualDate = firstDate(value);
return (minDate <= actualDate && actualDate <= maxDate);
}
然而,正如预期的那样,当我尝试在我的 IQueryable
中使用它时,我得到一个运行时异常,因为在 SQL 中没有对 DatesBetween 的转换。我希望通过保留表达式树,我可以……我不知道……让 EF 开心。整个事情是这样使用的:
return Entities
.GetEntitiesBySomeField(field := "magic value")
.Where(entity => RepositoryExtensions.DatesBetween(entity, MyPOCO.MyDates, dateFrom, dateTo));
我问的很清楚,有没有一种方法可以在不执行 AsEnumerable () 的情况下完成这种通用过滤(它确实有效,但没有实现我在 DB 上过滤的目标)。
最佳答案
我最近在一个项目中做了类似的事情。我最终做的是实现存储库模式并在存储库上创建一个名为“ApplyFilter”的方法,它看起来像:
void ApplyFilter(Expression<Func<TEntity, bool>> predicate)
{
if(this.resultSet == null)
{
this.resultSet = this.context.Set<TEntity>().AsQueryable();
}
this.resultSet = this.resultSet.Where(predicate);
}
我的存储库中有一个名为“ResultSet”的属性,它刚刚返回 IQueryable
我的代码与您的代码之间的真正区别在于,我的代码将 bool 谓词附加到最终表达式树,而当您尝试在最终表达式树中使用您的谓词时。我的方式基本上是为 SQL 创建/附加 WHERE 子句,您的方式尝试从“DatesBetween”方法生成 SQL 函数调用。
这里有一些尝试:
public static Expression<Func<TEntity, bool>> MakeDateRange<TEntity>(DateTime? dateFrom, DateTime? dateTo)
{
var et = typeof(TEntity);
var param = Expression.Parameter(et, "a");
var prop = et.GetProperty("UpdatedDate");
Expression body = null, left = null, right = null;
if (prop == null)
{
prop = et.GetProperty("CreatedDate");
if (prop == null)
{
prop = et.GetProperty("Date");
}
}
if (dateFrom.HasValue)
{
left = Expression.GreaterThanOrEqual(Expression.PropertyOrField(param, prop.Name), Expression.Constant(dateFrom.GetValueOrDefault()));
}
if (dateTo.HasValue)
{
right = Expression.LessThanOrEqual(Expression.PropertyOrField(param, prop.Name), Expression.Constant(dateTo.GetValueOrDefault()));
}
if (left != null && right != null)
{
body = Expression.AndAlso(left, right);
}
else if (left != null)
{
body = left;
}
else
{
body = right;
}
return Expression.Lambda<Func<TEntity, bool>>(body, param);
}
关于c# - 在 SQL Server 上筛选 Entity Framework 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8933939/
SQL、PL-SQL 和 T-SQL 之间有什么区别? 谁能解释一下这三者之间的区别,并提供每一个的相关使用场景? 最佳答案 SQL 是一种对集合进行操作的查询语言。 它或多或少是标准化的,几乎所有关
这个问题已经有答案了: What is the difference between SQL, PL-SQL and T-SQL? (6 个回答) 已关闭 9 年前。 我对 SQL 的了解足以完成我的
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列有一个默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任
我有一个可能属于以下类型的字符串 string expected result 15-th-rp 15 15/12-rp 12 15-12-th
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我有一个存储过程(称为 sprocGetArticles),它从文章表中返回文章列表。这个存储过程没有任何参数。 用户可以对每篇文章发表评论,我将这些评论存储在由文章 ID 链接的评论表中。 有什么方
我目前正在做一个 *cough*Oracle*cough* 数据库主题。讲师介绍embedded SQL作为让其他语言(例如 C、C++)与(Oracle)数据库交互的方式。 我自己做了一些数据库工作
SQL Server 中 SQL 语句的最大长度是多少?这个长度是否取决于 SQL Server 的版本? 例如,在 DECLARE @SQLStatement NVARCHAR(MAX) = N'S
这个问题已经有答案了: Simple way to transpose columns and rows in SQL? (9 个回答) 已关闭 8 年前。 CallType
预先感谢您对此提供的任何帮助。 假设我有一个查询,可以比较跨年的数据,从某个任意年份开始,永无止境(进入 future ),每年同一时期直到最后一个完整的月份(其特点是一月数据永远不会显示至 2 月
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列的默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任何数
下面是我试图用来检查存储过程是否不存在然后创建过程的 sql。它会抛出一个错误:Incorrect syntax near the keyword 'PROCEDURE' IF NOT EXISTS
我有一个同事声称动态 SQL 在许多情况下比静态 SQL 执行得更快,所以我经常看到 DSQL 到处都是。除了明显的缺点,比如在运行之前无法检测到错误并且更难阅读,这是否准确?当我问他为什么一直使用
来自 lobodava 的动态 SQL 查询是: declare @sql nvarchar(4000) = N';with cteColumnts (ORDINAL_POSITION, CO
使用 SQL Server 中的存储过程执行动态 SQL 命令的现实优点和缺点是什么 EXEC (@SQL) 对比 EXEC SP_EXECUTESQL @SQL ? 最佳答案 sp_executes
我有这个有效的 SQL 查询: select sum(dbos.Points) as Points, dboseasons.Year from dbo.StatLines dbos i
我正在调试一些构建成功运行的 SQL 命令的代码。 然而,在查询结束时,查询结果似乎被写入了一个文本文件。 完整的查询如下 echo SELECT DATE,DATETABLE,DATE,APPDAT
我有一些创建表的 .sql 文件(MS SQL 数据库): 表_1.sql: IF OBJECT_ID (N'my_schema.table1', N'U') IS NOT NULL DROP TAB
我写了下面的 SQL 存储过程,它一直给我错误@pid = SELECT MAX(... 整个过程是: Alter PROCEDURE insert_partyco @pname varchar(20
我在 SQL Server 2005 中有包含两列 Fruit 和 Color 的表,如下所示 Fruit Colour Apple Red Orange
我是一名优秀的程序员,十分优秀!