2011-05-02 69 views
0

我尝试将查询1重新分解为查询2语法...因为更具可读性等 像“group,begindate,enddate和excludeManifestatie”这样的参数是通过参数传递的(方法PARMS)..我检查他们是否为空白或不)通过与否,所以我可以建立我的LINQ的动态SQL。Linq方法语法 - 无法将IQueryable转换为Bool

但我得到的错误在查询1,当我使用....的HasValue检查。它说: “无法隐式转换类型‘System.Linq.IQueryable’到‘布尔’”

查询2正常工作,这就是我想要的东西,但它复杂的语法,所以我需要ŧ o纠正查询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)) 

新/更好的方式来写:

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

@Answerers:** **请停止发布废话改变if(where)'部分,就像'if(any/count/singleordefault)',因为这完全是另一回事。请阅读他的问题,特别是他的原始查询! – 2011-05-02 12:54:46

+0

@丹尼尔你是对的,我们肯定错过了这个问题的一些东西,但那东西可能在右上角:) – 2011-05-02 13:11:23

回答

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

我同意这个解决方案和你的意见。所有其他从我得到-1。 – Euphoric 2011-05-02 13:24:02

+0

它像机器一样工作,所以非常感谢。我比较了两个查询并给出了两条记录。你能解释一下为什么加入||吗? !a.begindate.HasValue)和|| !a.enddate.HasValue); statemetns。我的意思是当我删除|| !a.begindate.hasvalue我得到的记录较少,所以这意味着它应该在那里。如果我读完整行,说明得到的所有记录都已经生成,并且不能显示为今天的日期,或者给出所有记录,这些记录表明 说明没有价值。请在此声明中做一些小的澄清? – ethem 2011-05-02 13:30:45

+0

@mesut:当然。原因如下:你只想检查日期,如果设置了,那么检查'HasValue'。现在'(a.begindate。HasValue && a.begindate <= DateTime.Now)'返回true,如果(a)日期被设置并且(b)它现在小于或等于现在。您还希望拥有所有没有设置日期的记录。但是,如果未设置日期,则'(a.begindate.HasValue && a.begindate <= DateTime.Now)'返回false,因为'a.begindate.HasValue'为false。还要返回没有日期设置的记录,我用'!a.begindate.HasValue'添加了零件。 – 2011-05-02 13:37:02

-2

尝试从

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

更改为

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

这是别的......真的男生,读了这个问题。 – 2011-05-02 12:53:50

1

这不是当您使用HasValue,是时候ñ您使用Where作为条件。

如果你想检查是否有是符合HasValue状况的任何元素,你应该使用Any而不是Where

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

真的,为什么你们都发布这样的废话?这完全是另一回事 – 2011-05-02 12:52:28

+0

@Daniel Hilgarth:因为//给出错误评论。 – 2011-05-02 12:56:22

+0

而且?当然,它会给出错误,因为它是无效的。你的答案和所有其他答案表明你没有阅读他的问题,因为你的答案在语义上与他试图达到的不同。他试图在第一个查询中的问题中清楚地说明了他的想法! – 2011-05-02 12:58:08

相关问题