Linq方法语法-不能将IQueryable转换为Bool

本文关键字:IQueryable 转换 Bool 不能 方法 语法 Linq | 更新日期: 2023-09-27 17:54:05

我尝试将查询1重构为查询2的语法…因为更容易读懂等等。像"group、begindate、enddate和excludemanifestate"这样的参数是通过参数(方法parms)传递的。我检查它们是否为空白或不)通过或不,所以我可以建立我的动态Linq SQL。

但是当我使用....时,我在查询1中得到错误HasValue检查。它说:"不能隐式转换类型'System.Linq. "

查询2工作良好,这就是我想要的,但它有复杂的语法,所以我需要纠正查询1的语法。

查询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))

新的/更好的写作方式:

查询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);

Linq方法语法-不能将IQueryable转换为Bool

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

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);

不是当你使用HasValue时,而是当你使用Where作为条件时。

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

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

尝试从

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

query = query.SingleOrDefault(a => a.no_group == group);
相关文章: