实体框架中的LINQ附加到DATETIME WHERE子句上
本文关键字:DATETIME WHERE 子句 框架 LINQ 实体 | 更新日期: 2023-09-27 18:11:24
我试图在运行时建立一个WHERE子句。我创建了一个带有初始WHERE子句的查询:
var origSQL = (from ....
join ...
where ...
select new { ... } );
和将添加以下WHERE到origSQL:
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中删除了select部分,认为我可以稍后添加它:
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子句附加到这个子句上,然后将其全部附加到主查询上。我不知道这个的语法
每个查询必须有一个select,它将定义变量将保存的内容。在第二个示例中,您没有,因此无法编译。你应该这样做:
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表2.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();