[英]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.