Linq查询到orderby

时间:2015-03-18 09:50:56

标签: c# linq entity-framework

我的数据库有3个表。我想做的就是按表3中的最新日期订购

表格看起来有点像

表1

ID    CompanyId
1       1
2       1
3       2

表2

Id    CompanyColumn
1      Blah
2      Bleh

表3

Id    CompanyId    Date
1       1          5/1/2015
2       1          8/1/2015
3       1          15/1/2015
4       2          6/1/2015

我正在使用EF而我的对象基于Table1

所以,我可以做到

var tab1 = this.Entities.Table1;//I now have a reference to table 1


var result = from t in tab1
             group t by d.Table2.Table3.Select(a => a.Date)
             into g
             select g.FirstOrDefault();

错误讯息是

  

调用“GroupBy”方法的键选择器类型在底层商店提供程序中无法比较。

我试过

var result = from t in tab1
             group t by d.CompanyId
             into g
             select g.FirstOrDefault();

result = result.OrderByDescending(a => a.Table2.Table3.Select(b => b.DateTime));

错误讯息是

  

DbSortClause表达式必须具有可比较的类型。\ r \ nParameter name:key

我完全失去了

1 个答案:

答案 0 :(得分:2)

当你这样做时

d.Table2.Table3.Select(a => a.Date)

或者

a.Table2.Table3.Select(b => b.DateTime)

您将获得由第一个案例中的IQueryable<Date>或第二个案例中的IQueryable<DateTime>表示的完整日期序列。您收到错误,因为IQueryable<T>不是IComparable<IQueryable<T>>

基本上,问题是每个表达式可能产生多个DateDateTime。如果使用聚合函数替换Select,例如MinMax,则代码将编译:

var result = from t in tab1
         group t by d.Table2.Table3.Min(a => a.Date)
         into g
         select g.FirstOrDefault();

result = result.OrderByDescending(a => a.Table2.Table3.Min(b => b.DateTime));