繁体   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