2017-08-11 44 views
1

我有一個問題,我想創建一個返回對象列表的linq查詢。SQL TO Linq,如何返回對象並填充屬性

這是模型

public class Test 
{ 
[Key] 
public int ID { get; set; } 

[Required] 
[StringLength(5)] 
public string Code { get; set; } 

[Required] 
[StringLength(50)] 
public string Name { get; set; } 

[NotMapped] 
public string Reference { get; set; } 
} 

,我想要做的查詢很簡單:context.Test.ToList(); 這將返回數據庫映射參考爲null,因爲它不是表的一部分。

現在,如果我創建了一個LINQ查詢我知道我可以做選擇新{這裏所有領域} 我想避免這種情況:

select new Test 
{ 
Reference = r, 
ID = t.ID, 
Code = t.Code, 
Name = t.Name 
}).ToList(); 

是有可能做這樣的事情

(from t in context.Test 
join r in context.Reference on f.ID equals r.ID 
select new 
{ 
    t.Reference = r.Reference, 
    t 
}).ToList(); 

我想在同一個查詢中設置參考值,這可能嗎?

回答

2

你在LINQ to Entities中沒有直接支持你的問題 - 既沒有投影到實體類型,也沒有表達塊,這是分配現有對象屬性的唯一方法。

像往常一樣,典型的解決方法是拆分查詢兩部分 - 一個是LINQ到實體查詢選擇必要的數據(通常是中間匿名類型),然後切換到LINQ to Objects與AsEnumerable()和其他 - 在這種情況下使用內Select塊:

var result = 
    (from t in context.Test 
    join r in context.Reference on f.ID equals r.ID 
    select new { t, r.Reference } 
    ).AsEnumerable() 
    .Select(x => 
    { 
     x.t.Reference = x.Reference; 
     return x.t; 
    }).ToList(); 
+0

感謝這對我有用。 – user1981120

2

不要選擇一個匿名對象,只需從您擁有的對象中創建一個新的T.

(from t in context.Test 
join r in context.Reference on t.ID equals r.ID 
select new Test 
{ 
    Reference = r, 
    ID = t.ID, 
    Code = t.Code, 
    Name = t.Name 
}).ToList(); 

編輯:

爲了避免在所有屬性

public class Test 
{ 
    public int ID { get; set; } 

    public string Code { get; set; } 

    public string Name { get; set; } 

    public string Reference { get; set; } 

    public Test CopyWithReference(string reference) 
    { 
     var copy = (Test)this.MemberwiseClone(); 
     copy.Reference = reference; 
     return copy; 
    } 
} 

然後手動複製...

(from t in context.Test 
join r in context.Reference on t.ID equals r.ID 
select t.CopyWithReference(r)).ToList(); 
0

嘗試以下操作:

(from t in context.Test 
join r in context.Reference on f.ID equals r.ID 
select new Test() 
{ 
    ID = t.ID, 
    Code = t.Code, 
    Name = t.Name, 
    Reference = r.Reference 
}).ToList(); 
+0

,這就是我想喲避免,不必把所有的領域,在這個例子中,他們只有3場,但他們更。是更好的嗎?或者我們必須選擇新的並添加每個字段。 – user1981120

+0

唯一的另一種方法是在構造函數參數中將值作爲數組傳遞。 – jdweng

0

嘗試:

var result = context.Test.Include("Reference").ToList(); 

或:

var result = context.Test.Include(t => t.Reference).ToList(); 

或嘗試Lambda表達式:

var result = context.Test.Select(t => new { 
           t, 
           t.Reference = t.Reference.Select(r => new { 
               r.Reference }) 
      }).AsEnumerable().Select(x => x.r).ToList(); 
+0

感謝這對我也有效。 – user1981120

相關問題