如何将Linq中返回的null值更改为IQueryable

时间:2014-03-07 00:15:30

标签: c# asp.net linq

我正在尝试使用C#中的IQueryable上的LINQ查询结果填充listview控件。这应该是世界上最简单的操作,但我是asp.net,c#和visual studio的新手。我有这个:

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字段在设计上为null。我想使用以下值填充i.Distance字段:

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

geog是基于邮政编码的经度和纬度的变量。

有人请告诉我该怎么做吗?

2 个答案:

答案 0 :(得分: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. };

答案 1 :(得分: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将包含您需要的字段定义。