我正在使用Scott Guthrie的动态LINQ库以及Entity Framework和C#。
我必须根据几个因素将where字符串构建到变量中,然后将字符串变量传递给where子句。出于某种原因,这将有效:
ContactList = ContactList.Where("DateAdded >= @0", DateTime.Parse("12/1/2012"));
但这不起作用
string WhereClause = string.Format("DateAdded >= {0}", DateTime.Parse("12/1/2012"));
ContactList = ContactList.Where(WhereClause);
如上所述,我需要在传递变量的版本中使用它。谁知道为什么第二个不起作用?
提前致谢!
答案 0 :(得分:13)
我能够使用信息here来使用稍微不同的字符串格式。
这样做对我来说很好:
ContactList.Where("DateAdded >= DateTime(2013, 06, 18)")
请注意,这对DateTimeOffset
列不起作用。
答案 1 :(得分:4)
对于当前的DynamicLINQ库,我似乎无法做到这一点。 Tilak在下面详细介绍了它不起作用的原因。
我的解决方案是修改DynamicLINQ库以允许将查询写为字符串并传递给Date / Time数据类型的where子句。 Paul Hatcher在此发现了修改:LINQ TO SQL, Dynamic query with DATE type fields
答案 2 :(得分:1)
ObjectQuery.Where overload接受2个参数。
string predicate
params ObjectParameter[] parameters
在第一个示例中,Where
使用ObjectParameter
参数构建查询(where子句)(使用ObjectParameter
的名称,类型和值)
在你的第二个例子中,传递的内容被视为final where子句(没有基于传递的参数的数据类型进行内部转换)。
答案 3 :(得分:1)
根据Richard Rout的选择,略作修改:
ContactList.Where("DateAdded >= DateTime(2013, 06, 18)")
这适用于我的Linq2Entities解决方案。请注意DateTime
而不是Date
。
希望这可以拯救这个问题给我带来的头痛。
答案 4 :(得分:0)
ContactList.Where
可能会在非数字参数(例如DateTime)周围加上引号。在第二个字符串中,未引用日期。
答案 5 :(得分:0)
动态 linq 核心和 ef 3.1 与 sql server 有类似问题,通过显式设置列类型解决了:
流畅的方式:
modelBuilder.Entity<Contact>().Property(p => p.DateAdded).HasColumnType("datetime")
属性方式:
public class Contact
{
[Column(TypeName = "datetime")]
public DateTime DateAdded { get; set; }
}
用法:
ContactList = ContactList.Where("DateAdded == @0", "2021-03-25 02:29:00.000");
sql server 日期时间格式:YYYY-MM-DD hh:mm:ss[.nnn]