Linq ToString()如何转换?

时间:2018-08-13 19:46:21

标签: c# entity-framework linq

我知道Linq无法处理ToString(),并且我已经阅读了一些解决方法,大多数似乎是在Linq查询之外进行转换,但这是针对我试图将其推翻的输出进入列表,这就是爆炸的地方。

如下面的代码所示,为了使它适合Linq,我已经在其他地方进行了强制转换,但是最后一部分有tostring,我也需要重写,但是我不确定如何。

DateTime edate = DateTime.Parse(end);
DateTime sdate = DateTime.Parse(start);

var reading = (from rainfall in db.trend_data
               join mid in db.measurements on rainfall.measurement_id equals mid.measurement_id
               join siteid in db.sites on mid.site_id equals siteid.site_id
               where siteid.site_name == insite && rainfall.trend_data_time >= sdate && rainfall.trend_data_time <= edate
               select new GaugeData() { SiteID = siteid.site_name, Data_Time = rainfall.trend_data_time, Trend_Data = float.Parse(rainfall.trend_data_avg.ToString()) }).ToList();

2 个答案:

答案 0 :(得分:3)

Linq将处理它,但是Linq2Entities不会,因为EF希望将该表达式传递给DbProvider,后者无法理解/转换所有.Net方法。

在从实体中提取数据时,最麻烦的途径是让您的实体定义应使用与SQL数据类型匹配的兼容.Net类型。然后,当您要将数据加载到可能要执行格式或数据类型转换的视图模型/ DTO中时,让ViewModel / DTO处理该数据或将您的Linq2Entity查询预先物化为匿名类型列表,然后处理转换/ w Linq2Object。

在不知道TrendDataAvg的数据类型的情况下,该示例的值存储为小数,但您想使用float:

在ViewModel示例中格式化:

PropertyChangeListener

匿名类型示例:

public class TrendData // Entity
{  // ...
   public decimal trend_data_avg { get; set; }
   // ...
}

public class GuageData  // ViewModel
{
   public decimal trend_data_avg { get; set; } // Raw value.
   public float Trend_Data // Formatted value.
   {
      get { return Convert.ToSingle(trend_data_avg); }
   }
}

var reading = (from rainfall in db.trend_data
               join mid in db.measurements on rainfall.measurement_id equals mid.measurement_id
               join siteid in db.sites on mid.site_id equals siteid.site_id
               where siteid.site_name == insite && rainfall.trend_data_time >= sdate && rainfall.trend_data_time <= edate
               select new GaugeData() { SiteID = siteid.site_name, Data_Time = rainfall.trend_data_time, trend_data_avg = rainfall.trend_data_avg }).ToList();

注意:如果您使用Anonymous Type方法并希望利用分页,其他过滤等方法,请确保在 初始.ToList()调用之前进行此操作,以便由Linq2EF。否则,与潜在的性能和资源利用问题相比,从EF中获取的数据量要大得多。

此外,如果您在实体中设置导航属性,则可以避免所有显式联接语法。 EF旨在提升关系数据库的功能,而不仅仅是T-SQL的替代语法。

public class GuageData  // ViewModel
{
   public float Trend_Data { get; set; }
}

var reading = (from rainfall in db.trend_data
    join mid in db.measurements on rainfall.measurement_id equals mid.measurement_id
    join siteid in db.sites on mid.site_id equals siteid.site_id
    where siteid.site_name == insite && rainfall.trend_data_time >= sdate && rainfall.trend_data_time <= edate
    select new 
    { 
        siteid.site_name, 
        rainfall.trend_data_time, 
        rainfall.trend_data_avg 
    }.ToList() // Materializes our Linq2Entity query to POCO anon type.
    .Select( x=> new GaugeData
    {
        SiteID = site_name, 
        Data_Time = trend_data_time, 
        Trend_Data = Convert.ToSingle(trend_data_avg) 
    }).ToList();

答案 1 :(得分:0)

您可以使用Convert.ToSingle()方法,floatsystem.single的别名。

Trend_Data = Convert.ToSingle(rainfall.trend_data_avg)