2010-03-08 79 views
3

我試圖得到一些數據,但我不知道我該怎麼做,如果在LINQ,我這是怎麼試圖做幫助的LINQ查詢

from so in db.Operations 
where ((opType!= "0" ? so.Operation == int.Parse(opType) : false) 
    && (idState!=0 ? so.State == idState : false) 
    && (start != null ? so.StartDate == start : false) 
    && (end !=null ? so.EndDate == end : false)) 
select so 

的OPTYPE是一個詮釋, 該idState是一種詮釋, 到底是一個日期, 開始是datime

什麼,我試圖做的是,如果這些不爲空,他們增加了查詢功能,這樣我就可以得到所有的數據一起

例如:在c#代碼

if((opType!= "0") 
where (so.Operation == int.Parse(opType) 
if(idState!=0) 
where (so.Operation == int.Parse(opType) && so.State == idState 
....... 

所以如果那不是null,那句話在那個sql查詢中(TRUE部分,我不想使用false部分),將它添加到where,所以我可以搜索所有參數aren 「T null或0

+0

你能描述你想要做什麼。並且添加一些你想要回來的信息。目前只有在設置了所有元素(optype,idState,end和start)(即不包含它們的默認值)並且滿足所有條件時,才返回結果。 – AxelEckenberger 2010-03-08 23:15:37

+0

@Luis - 如果值爲空,您希望忽略它們並無限制地返回數據?或者,如果其中任何一個爲空,您希望查詢返回什麼? – 2010-03-08 23:16:49

+0

嗨,我可以是如果變量爲空不添加到哪裏句,如果不是null添加到哪裏sensece,例如 if(opType!= 0)
其中so.operation ==整數。解析(optype)
如果(start!= null)
其中so.start == start && so.operation == int.parse(optype)... – Luis 2010-03-08 23:24:58

回答

0

嘛不知道你想要什麼確切的,但這裏是一個嘗試:

var query = db.Operations.AsQueryable(); 

if (opType != null && opType != "0") 
    query = query.Where(x => x.Operation == int.Parse(opType); 

if (idState != 0) 
    query = query.Where(x => x.State == idState); 

if (start != null) // assuming that start is of type DateTime? otherwise use DateTime.MinValue 
    query = query.Where(x => x.StartDate.Date == start); // maybe >= is more appropriate 

if (end != null) // also DateTime? assumed 
    query = query.Where(x => x.EndDate.Date == end); // maybe <= is more appropriate 

var result = query.ToList(); // e.g. could also do an foreach, depending what you want to do 

這種方法的訣竅是逐步建立查詢。查詢將不會被枚舉,直到.ToList()foreach被用來枚舉列表。

其實這應該產生相同的:

from so in db.Operations 
where ((opType != null && opType!= "0" ? so.Operation == int.Parse(opType) : true) 
    && (idState!=0 ? so.State == idState : true) 
    && (start != null ? so.StartDate.Date == start : true) 
    && (end !=null ? so.EndDate.Date == end : true)) 
select so 
+0

定時問題,我的答案和你的類似,會刪除我的。 – 2010-03-08 23:28:45

+0

否,請參閱編輯...查詢在例如調用'.ToList()'。這裏使用的概念是「延遲執行」。 – AxelEckenberger 2010-03-08 23:33:20

+0

ahhh thx,我會試試:) – Luis 2010-03-08 23:36:57

0
opType!= "0" ? so.Operation == int.Parse(opType) : false 

,你不應該使用so.operation == int.parse ....改用so.operation = int.Parse(OPTYPE)

+0

不工作,因爲我不想要egualate。 我不知道我是否解釋得很好,但是假,我不想用,我只想用真正的部分 – Luis 2010-03-08 23:11:51

+0

你是說你應該使用'so.operation = int.Parse(opType) ?這將是一個賦值操作,在where查詢中沒有意義。 – AxelEckenberger 2010-03-08 23:17:13

+0

我想要做的是,例如 如果(OPTYPE!= 0) 其中so.operation == int.parse(OPTYPE) //如果是不是空加的到 如果(開始!= null) where so.start == start && so.operation == int.parse(optype)... 所以它可以用所有參數搜索 – Luis 2010-03-08 23:20:30

1

既然你&&「荷蘭國際集團他們,看起來像你想: true而不是: false

+0

我想&&因爲我想補充,如果變量不爲空,所以它可與所有搜索參數不爲空 – Luis 2010-03-08 23:22:42

+0

@Luis:對,但是我的意思是,如果它是-is- null,你不想'&& false',因爲它總是會返回一個空集。所以你應該保留&&,但是用':true'替換你的':false'。 – Tanzelax 2010-03-08 23:29:40

0

您可以使用條件參數。

變化:

where ((opType!= "0" ? so.Operation == int.Parse(opType) : false) 

要:

where ((opType!= "0" ? so.Operation == int.Parse(opType) : so.Operation == Operation) 

等等...