2014-03-07 76 views
1

我試圖用C#中的IQueryable上的LINQ查詢的結果填充listview控件。這應該是世界上最簡單的操作,但我是asp.net,c#和visual studio的新手。我所擁有的是這樣的:如何將LINQ中返回的空值更改爲IQueryable

var query = from i in _db.ItemListView       
    where (!string.IsNullOrEmpty(key)) ? i.Description.Contains(key) : true && 
     DbGeography.FromText(i.Point).Distance(DbGeography.FromText(geog))*0.0006214 <= rng && 
     (cat != null) ? i.CategoryID == cat : true && 
     (sub != null) ? i.SubCategoryID == sub : true && 
     (min != null) ? i.AskingPrice >= min : true && 
     (max != null) ? i.AskingPrice <= max : true       
    orderby i.Distance ascending, i.AskingPrice ascending 
    select i; 
return query; 

這工作,但i.Distance場返回從數據庫是由設計空。我想填充i.Distance領域從價值觀:

DbGeography.FromText(i.Point).Distance(DbGeography.FromText(geog)) 

geog是基於對郵政編碼的經度和緯度的變量。

有人請告訴我如何做到這一點?

+0

那是你的OrderBy無法正常工作,因爲i.Distance是返回null的問題?我不確定我是否理解你的問題。 Linq大多是一個只讀範例;如果你想把數據寫入某些東西,你需要做一些不同的事情。 –

+0

i.Distance始終爲空。我想將它的值更改爲:DbGeography.FromText(i.Point).Distance(DbGeography.FromText(geog))並按結果排序。 –

+0

遍歷查詢對象中的記錄,並將i.Distance字段更改爲您需要的值。然後對結果運行一個新的linq查詢以獲得正確的排序。 –

回答

2

您需要計算距離,然後選擇一個包含它的新對象。喜歡的東西:

var query = from i in _db.ItemListView 
    let dist = DbGeography.FromText(i.Point).Distance(DbGeography.FromText(geog)) 
    where (!string.IsNullOrEmpty(key)) ? i.Description.Contains(key) : true && 
     dist*0.0006214 <= rng && 
     (cat != null) ? i.CategoryID == cat : true && 
     (sub != null) ? i.SubCategoryID == sub : true && 
     (min != null) ? i.AskingPrice >= min : true && 
     (max != null) ? i.AskingPrice <= max : true       
    orderby dist ascending, i.AskingPrice ascending 
    select new WhateverYourClassNameIs(constructor parameters here); 
return query; 

或者,你可以使用

select new Whatever { field1=value, field2=value, etc. }; 
+0

Gah !!我試了三次同樣的事情,但沒有運氣,但是當我剪下並粘貼你的代碼並做了一些修改後,它就起作用了!非常感謝Jim Michael! –

0

聽起來像你需要一個定製select

... 
select new { 
    // other fields here, 
    ... 
    MyNewDistanceField = DbGeography.FromText(i.Point).Distance(DbGeography.FromText(geog)) 
} 

或替代,映射你的輸出字段到自定義類:

select YourCustomClass { 
    // other fields here, 
    ... 
    MyNewDistanceField = DbGeography.FromText(i.Point).Distance(DbGeography.FromText(geog)) 
} 

YourCustomClass將包含你所需要的字段定義。

相關問題