Linq方法语法 - 无法将IQueryable转换为Bool

时间:2011-05-02 12:44:23

标签: c# linq linq-to-entities

我尝试将查询1重新考虑为查询2语法...因为更具可读性等。 像“group,begindate,enddate和excludeManifestatie”这样的参数通过参数(方法参数)传递。我检查它们是否为空白)是否传递,所以我可以构建我的动态Linq SQL。

但是当我使用...... HasValue检查时,我在查询1中收到错误。它说: “无法将类型'System.Linq.IQueryable'隐式转换为'bool'”

查询2工作正常,这就是我想要的,但它的语法很复杂,所以我需要更正查询1语法。

QUERY 1:

((String.IsNullOrEmpty(group)) ? (a.id != -1) : (a.no_group == group))
&& ((group.Equals("990") || (group == string.Empty)) ? (!a.displaylocal.HasValue || a.displaylocal.Value == false) : (a.id != -1))
&& ((a.begindate.HasValue ? DateTime.Now >= a.begindate.Value : a.id != -1) &&
    (a.enddate.HasValue ? DateTime.Now <= a.enddate.Value : a.id != -1))
&& ((String.IsNullOrEmpty(excludeManifestatie)) ? (a.id != -1) : (a.type_manifestation != excludeManifestatie))

新/更好的写作方式:

QUERY 2:

   var query = dc.agenda.AsQueryable();
if (!string.IsNullOrEmpty(group))
    query = query.Where(a => a.no_group == group);
if (group.Equals("990") || group.Equals(string.Empty))
    if ((query.Where(a => a.displaylocal.HasValue))) //Gives ERROR
        query = query.Where(a => a.displaylocal >= DateTime.Now);
if (!string.IsNullOrEmpty(excludeManifestatie))
    query = query.Where(a => a.type_manifestation != excludeManifestatie);
if (query.Where(a => a.begindate.HasValue)) //Gives ERROR
    query = query.Where(a => a.begindate <= DateTime.Now);
if ((query.Where(a => a.enddate.HasValue))) //Gives ERROR
    query = query.Where(a => a.enddate >= DateTime.Now);

3 个答案:

答案 0 :(得分:4)

你不能这样做。如果要根据每行中的数据包含条件,则需要采用自己的方式。我在你的上一个问题中向你展示的方法只有在应该根据外部参数添加条件时才有效。我会用这个条件:

query = query.Where(a => (a.begindate.HasValue && a.begindate <= DateTime.Now) || 
                         !a.begindate.HasValue);

您的完整代码如下所示:

var query = dc.agenda.AsQueryable();
if (!string.IsNullOrEmpty(group))
    query = query.Where(a => a.no_group == group);
if (group.Equals("990") || group.Equals(string.Empty))
    query = query.Where(a => (a.displaylocal.HasValue && a.displaylocal >= DateTime.Now) || 
        !a.displaylocal.HasValue);
if (!string.IsNullOrEmpty(excludeManifestatie))
    query = query.Where(a => a.type_manifestation != excludeManifestatie);
query = query.Where(a => (a.begindate.HasValue && a.begindate <= DateTime.Now) || 
                         !a.begindate.HasValue);
query = query.Where(a => (a.enddate.HasValue && a.enddate >= DateTime.Now) || 
                         !a.enddate.HasValue);

答案 1 :(得分:1)

当您使用HasValue时,并非使用Where作为条件。

如果您想检查是否有符合HasValue条件的任何元素,您应该使用Any代替Where

if (query.Any(a => a.begindate.HasValue))

答案 2 :(得分:-2)

尝试从

改变
query = query.Where(a => a.no_group == group);

query = query.SingleOrDefault(a => a.no_group == group);