2013-06-20 76 views
2

我有一個方法,我一直在使用IEnumerable沒有問題。不過,我想開始將它用於IQueryable。但是,我現在擁有它的方式不會像它試圖對數據庫執行我的方法那樣工作。一種圍繞LINQ to Entities的方法不能識別該方法?

情況如下。如果從中選擇的值爲null,或者如果存在屬性的Id和Name,我希望我選擇的對象的屬性爲null。例如:

var foos = FooRepository.All().Select(s => new FooBrief() 
{ 
    Id = s.Id, 
    Customer = SimpleData.To(s.Customer, m => m.Id, m => m.Name) 
}); 

其中SimpleData.To樣子:

public class SimpleData 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public static SimpleData To<T>(T t, Func<T, int> id, Func<T, string> name) where T : class 
    { 
     if (t != null) 
     { 
      return new SimpleData { Id = id(t), Name = name(t) }; 
     } 
     return null; 
    } 
} 

有什麼方法我能得到這個行爲,同時允許其對數據庫執行?

注意:由於我的代碼中的其他地方的原因,我不能使用.ToList()。我可以在以後

+0

你可以使用'ToArray'嗎? :-)你不能相關的原因。 –

+0

我不能這樣做的原因是,在這一點之後,我可能需要爲iqueryable添加額外的子句。所以我仍然希望它對數據庫執行 –

+0

這裏有相關信息... http://stackoverflow.com/questions/17187395/using-my-own-method-with-linq-to-entities – qujck

回答

2

可以添加額外的濾波最簡單的方法是剛剛執行外數據庫中選擇,使用AsEnumerable

var foos = FooRepository.All() 
         .Select(x => new { Id = x.Id, 
              CustomerId = x.Customer.Id, 
              CustomerName = x.Name }) 
         .AsEnumerable() 
         .Select(s => new FooBrief { 
            Id = s.Id, 
            Customer = new SimpleData { 
             Id = s.CustomerId, 
             Name = s.CustomerName 
            } 
           }); 

第一Select只是爲了確保該數據庫查詢只會提取所需的字段。如果你真的想用你的SimpleData.To方法:

// Outdented to avoid scrolling 
var foos = FooRepository.All() 
    .Select(x => new { Id = x.Id, 
         CustomerId = x.Customer.Id, 
         CustomerName = x.Name }) 
    .AsEnumerable() 
    .Select(s => new FooBrief { 
       Id = s.Id, 
       Customer = SimpleData.To(s, 
             s => s.CustomerId, 
             s => s.CustomerName) 
      }); 
+0

這個問題我有,我認爲我沒有說清楚。是否可以在此查詢之後(例如A where子句)在此點之後添加添加篩選。 –

+0

@mjmcloug:那麼爲什麼不在這一點之前添加*?基本上你不能執行一個自定義的.NET方法,而你仍然在EF的一部分......至少在一般情況下。 (我相信存在將簡單方法映射到存儲過程的方法,但這對您的情況沒有幫助。)您需要接受並正確設計。 –

+0

同意。在提出這個問題時,我假設最壞,但我很好奇,看看是否有一種我不知道的巧妙方式。恐怕以前不是一種選擇。我必須考慮這個問題 –

相關問題