有一個結構:實體框架 - 其中任何()和所有()使用的clausule使用
客戶端有多個案件和案件有多個LOGS。
public class Client
{
public int Id { get; set; }
public IEnumerable<Case> Cases { get; set; }
}
public class Case
{
public int CaseId { get; set; }
public IEnumerable<Log> Histories { get; set; }
}
public class Log
{
public int Id { get; set; }
public string Code { get; set; }
}
我想檢索客戶端的所有日誌'從每個案例代碼屬性設置爲「錯誤」或根本沒有日誌的客戶端。除此之外,我還有一些簡單的條件,您可以在下面簡化發佈代碼(EF使用IQueryable而不是ICollection)。
首先,我嘗試創建名爲AllOrEmpty的擴展方法,它可以正常工作,但不能在Linq中使用實體(它不接受擴展方法)。
public static class Extensions
{
public static bool AllOrEmpty<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
return source.All(predicate) || !source.Any();
}
}
var sampleIds = new List<int>() { 1, 2, 3 };
Entities db = new Entities();
db.Clients
.Where(client => client.Cases
.Where(cas => sampleIds.Contains(cas.CaseId))
.SelectMany(cas => cas.Histories
.Where(log => log.Id < 10)
)
.AllOrEmpty(log => log.Code == "WRONG") << ideal solution
)
.Select(client => client.Id);
其次,我試圖在clausule創建具有return語句lambda表達式,它工作正常,但不是IQueryable的和返回錯誤:與語句體lambda表達式不能轉換爲表達式樹
db.Clients
.Where(client =>
{
var logs = client.Cases
.Where(cas => sampleIds.Contains(cas.CaseId))
.SelectMany(cas => cas.Histories
.Where(log => log.Id < 10)
);
return !logs.Any() || logs.All(log => log.Code == "WRONG");
})
.Select(client => client.Id);
我不知道如何創建這樣的查詢,並保持它簡單,並避免一些髒代碼。任何想法?
可能複製[Entity Framework Filter「Expression>」](http://stackoverflow.com/questions/18337692/entity-framework-filter-expressionfunct-bool) –
Igor