Linq方法语法-无法将IQueryable转换为Bool [英] Linq Method Syntax - Can not convert IQueryable to Bool
问题描述
由于可读性更高,我尝试将查询1重构为2语法... 诸如"group,begindate,enddate和excludeManifestatie之类的参数通过参数(方法参数)传递.
但是当我使用.... HasValue检查时,在查询1中出现错误.它说: 无法将类型'System.Linq.IQueryable'隐式转换为'bool'"
查询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);
您不能这样做.如果要在每行中都包含基于数据的条件,则需要采用自己的方式.我在上一个问题中向您展示的方法仅在条件应基于外部参数添加的情况下才有效.我会用这种情况:
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);
I try to re-factor query 1 to query 2 syntax... because of more more readable etc. paramaters like "group, begindate, enddate and excludeManifestatie are passed via argument (method parms).. I check whether they are blank or not )passed or not so I can built my dynamic Linq SQL.
But I get error in Query 1 when I use ....HasValue check. It says: "Cannot implicitly convert type 'System.Linq.IQueryable' to 'bool'"
Query 2 works fine and that's what I want, but it has complicated syntax, so I need to correct Query 1 syntax.
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))
NEW/BETTER WAY to WRITE:
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);
You can't do it like this. If you want to include a condition based on data in each individual row, you need to resort to your way. The method I showed you in your last question only works if the condition should be added based on a external parameter. I would use this condition:
query = query.Where(a => (a.begindate.HasValue && a.begindate <= DateTime.Now) ||
!a.begindate.HasValue);
Your complete code looks like this:
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);
这篇关于Linq方法语法-无法将IQueryable转换为Bool的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!