我正在嘗試將 LinQ Intersect (或等效)用于 IQueryable 方法,但似乎我做錯了。
我有一些符合某些規格的產品(如顏色、材料、高度......),這些規格有不同的值,例如:
顏色:藍色、紅色、黃色高度:128cm、152cm...
我需要獲得與我提供的所有情侶 specifityId / specifityValue 串列匹配的產品。
這是我想要做的:
// The list of couple SpecifityID (color, material..) / SpecifityValue (red, yellow, wood...)
List<string> SpecId_SpecValue = new List<string>();
SpecId_SpecValue.Add("3535a444-1139-4a1e-989f-795eb9be43be_BEA");
SpecId_SpecValue.Add("35ad6162-a885-4a6a-8044-78b68f6b2c4b_Purple");
int filterCOunt = SpecId_SpecValue.Count;
var query =
Products
.Include(pd => pd.ProductsSpecifity)
.Where(z => SpecId_SpecValue
.Intersect(z.ProductsSpecifity.Select(x => (x.SpecifityID.ToString() "_" x.SpecifityValue)).ToList()).Count() == filterCOunt);
我收到錯誤訊息:InvalidOperationException:無法翻譯 LINQ 運算式 'DbSet()。以可翻譯的形式重寫查詢,或通過插入對“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的呼叫顯式切換到客戶端評估。有關詳細資訊,請參閱https://go.microsoft.com/fwlink/?linkid=2101038。這意味著它不能被翻譯成 SQL,我需要在我的過濾器之前 ToList。
問題是,我不想呼叫 ToList() 因為我的資料庫中有大量產品,我不想在過濾它們之前將它們加載到記憶體中。
還有其他方法可以實作我需要做的嗎?
uj5u.com熱心網友回復:
該查詢表示“所有x.SpecifityID.ToString() "_" x.SpecifityValue組合與某些給定組合完全匹配的產品”。
Except由于各種原因,我不在這里討論,因此集合組合運算子通常不能很好地與 EF 配合使用。幸運的是,在許多這些情況下,可以使用ContainsEF 很好地支持該解決方法。在你的情況下:
var query = Products.Include(pd => pd.ProductsSpecifity)
.Where(z => z.ProductsSpecifity
.Select(x => x.SpecifityID.ToString() "_" x.SpecifityValue)
.Count(s => SpecId_SpecValue.Contains(s)) == filterCount);
請注意,比較效率不高。在比較之前轉換資料庫值會禁用索引的任何使用(不是sargable)。但是在 EF 中更有效地執行此操作并非易事,請參閱this。
uj5u.com熱心網友回復:
我最終使用了@Gert Arnold在此處提供的鏈接中找到的解決方案。
我使用了 BlazarTech.QueryableValues.SqlServer @yv989c 的答案
這是現在像魅力一樣作業的東西:
// The list of couple SpecifityID (color, material..) / SpecifityValue (red, yellow, wood...)
Dictionary<Guid, string> SpecId_SpecValue = new Dictionary<Guid, string>();
SpecId_SpecValue.Add(new Guid("3535a444-1139-4a1e-989f-795eb9be43be"), "BEA");
SpecId_SpecValue.Add(new Guid("35ad6162-a885-4a6a-8044-78b68f6b2c4b"), "Purple");
// BlazarTech.QueryableValues.SqlServer
var queryableValues = DbContext.AsQueryableValues(SpecId_SpecValue);
var query = Products.Include(pd => pd.ProductsSpecifity)
.Where(x => x.ProductsSpecifity
.Where(e => queryableValues
.Where(v =>
v.Key == e.SpecifityID &&
v.Value == e.SpecifityValue
)
.Any()
).Count() == dynamicFilter.Count);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/446710.html
下一篇:System.Data.Entity.Core.EntityException:“底層提供程式在打開時失敗。”錯誤?
