[英]LINQ in Entity Framework append onto DATETIME WHERE clause
我正在尝试在运行时构建WHERE子句。 我创建了带有初始WHERE子句的查询:
var origSQL = (from ....
join ...
where ...
select new { ... } );
并将向origSQL添加以下WHERE:
var endDate = (from table1 in db.Table1
join aliasTable1 in db.Table1 on table1.id equals aliasTable1.id
where aliasTable1.anotherId == anInputStr
&& (table1.field1 == aliasTable1.field1)
select DbFunctions.TruncateTime(aliasTable1.endDate)).Max();
...
在附加到原始WHERE之前,endDate将需要进一步完善,例如:
if (!string.IsNullOrEmpty(anotherInputStr) && (anotherInputStr == "FOO"))
endDate = endDate.Where ( a=> aliasTable1.GRADE == "F" );
在此,我得到错误:
DateTime does not contain a definition for Where accepting a first argument of type DateTime
因此,我从初始endDate中删除了选择部分,以确保以后可以添加它:
var endDateCriteria = from table1 in db.Table1
join aliasTable1 in db.Table1 on table1.id equals aliasTable1.id
where aliasTable1.anotherId == anInputStr
&& (table1.field1 == aliasTable1.field1)
if (!string.IsNullOrEmpty(anotherInputStr) && (anotherInputStr == "FOO"))
endDateCriteria = endDateCriteria .Where ( a=> aliasTable1.GRADE == "F" );
但是
.Where
仍然引起问题。 我需要将这些检查添加到此WHERE中,然后再添加到原始查询中,并且找不到正确的语法。
已添加这最初是自连接。 原始的动态SQL看起来像这样
origSQL := ' AND table1.endDate = (
SELECT MAX(endDate)
FROM table1 aliasTable1
WHERE aliasTable1.ID = table1.ID)
而且,我尝试将其他WHERE子句附加到此子句中,然后将其整体将附加到主查询中。 我不知道这个语法。
每个查询必须有一个选择,它将定义变量将保存的内容。 在第二个示例中,您没有任何示例,因此无法编译。 您应该执行以下操作:
var endDateCriteria = from table1 in db.Table1
join aliasTable1 in db.Table1 on table1.id equals aliasTable1.id
where aliasTable1.anotherId == anInputStr
&& (table1.field1 == aliasTable1.field1)
select new { table1, aliasTable1 };
if (!string.IsNullOrEmpty(anotherInputStr) && (anotherInputStr == "FOO"))
endDateCriteria = endDateCriteria.Where(q => q.aliasTable1.GRADE == "F");
if (somethingElse)
endDateCriteria = endDateCriteria.Where(q => q.aliasTable1.field1 > value);
if (otherCondition)
endDateCriteria = endDateCriteria.Where(q => q.table1.field2 != value2);
DateTime result = endDateCriteria.Max(q => q.aliasTable1.endDate).Date;
在这里,我在存储endDateCriteria
两个表中一个匿名对象,所以我以后会继续使用这两个表对我的条件,并在最后我得到的最大日期。 我看不到需要使用TruncateTime
。
原始海报评论中提到的带条件的编辑答案:
var endDates = (from table1 in db.Table1
join table2 in db.Table2 on table1.id equals table2.id
where table2.anotherId == anInputStr
&& (table1.field1 == table2.field1);
if(YOUR CONDITION)
{
endDates = endates.Where(e=> e.).Grade == "F")
}
var endate = from endates select DbFunctions.TruncateTime(table2.endDate)).Max();
你最初的单一对象(Maximume table2.enddate)上运行.Where
作用于一个集合。
var endDate = (from table1 in db.Table1
join table2 in db.Table2 on table1.id equals table2.id
where table2.anotherId == anInputStr
&& (table1.field1 == table2.field1)
&&表(我不知道哪个表)。等级==“ F”
select DbFunctions.TruncateTime(table2.endDate)).Max();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.