簡體   English   中英

實體框架中的LINQ追加到DATETIME WHERE子句

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM