2017-07-04 108 views
-1

的接收器我有2执行外部联接这样的LINQ查询:LINQ的外连接和指定DefaultIfEmpty值 - 匿名类型不包含定义defaultifempty ..需要类型

  var finalDataSet = from a in alpha 
           join b in beta on a.field1 equals b.field1 
           // *outer join* 
           join c in charlie on a.field2 equals c.field2 into c_2 
           from c2 in c_2.DefaultIfEmpty(new MyObject1 { MyProperty1 = (string) String.Empty, MyProperty2 = (DateTime?) null }) 
           join d in delta on a.field3 equals d.field3 
           // *outer join* 
           join e in echo on a.field4 equals e.field4 into e_2 
           from e2 in e_2.DefaultIfEmpty(new MyObject2 { MyProperty3 = String.Empty, MyProperty4 = String.Empty }) 
           orderby a.field1 
           select new 
           { 
            FinalProperty1 = a.field1, 
            FinalProperty2 = a.field2, 
            etc ... 

..和

MyObject1:

public class MyObject1 
{ 
    public string MyProperty1 { get; set; } 
    public DateTime? MyProperty2 { get; set; } 
} 

MyObject2:我对我newing弥补了 'DefaultIfEmpty' 值类型的类型定义

public class MyObject2 
{ 
    public string MyProperty3 { get; set; } 
    public string MyProperty4 { get; set; } 
} 

第二届外连接(以“回声”)是好的,但对于第一次,我得到的编译错误,当我引用这条线上C_2:

from c2 in **c_2** --> compiler doesn't like the reference to c_2 

我得到这个错误:

IEnumerable <<anonymous type: string Property1, DateTime? Property2 >> does not contain a definition for 'DefaultIfEmpty' and the best extension method overload 'Queryable.DefaultIfEmpty' <MyObject1>(IQueryable<MyObject1>, MyObject1)' requires a receive of type 'IQueryable<LatestExpiredSchedule>' 

为什么我得到这个错误为我的第一次加入,而不是第二次?如果我将第一次加入更改为:

from e2 in e_2.DefaultIfEmpty() 

我没有收到错误,但我需要明确指定默认值。错误消息的真正含义是什么,以及如何指定我的第1个左外部联接的默认值?

+0

请参阅msdn left outer join:https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – jdweng

回答

0

找到了答案 - 我的'查理'在上述查询是linq查询的结果,因此返回匿名类型。我需要为该查询返回的每个结果构造一个MyObject1对象。