我有一個不完整的產品模型串列。每個人都缺少所有者和價格。這些缺陷可以通過對背景關系的單個查詢來彌補嗎?沒有這個 foreach 回圈?
foreach(var item in products)
{
item.Owner = context.Products.Where(x => x.Id == item.Id).Select(x => x.ProductOwner).FirstOrDefault();
item.Price = context.Products.Where(x => x.Id == item.Id).Select(x => x.ProductPrice).FirstOrDefault();
}
我想要一個查詢來填寫 IEnumerable 產品中的缺失欄位
uj5u.com熱心網友回復:
// build list of Id for which we need data
var idsToUpdate = products.Select(o => o.Id).ToList();
var dataById = Context.Products
// get matching entries (server side)
.Where(x => idsToUpdate.Contains(x.Id))
// get only relevant data
.Select(x => new { x.Id, x.ProductOwner, x.Price })
// ensure uniqueness (server side, free if Id is a PK)
.DistinctBy(x => x.Id)
// we will not update db
.AsNoTracking()
// now client side
.AsEnumerable()
// arrange the data
.ToDictionary(x => x.Id, x => new { x.ProductOwner, x.Price });
foreach (var item in products)
{
if (!dataById.TryGetValue(item.Id, out var data))
continue;
item.ProductOwner = data.ProductOwner;
item.Price = data.Price;
}
如果資料不多,請嘗試查詢一次,也許?
- 選擇所有目標id
- 從 DB 獲取所有產品
- 隨心所欲地處理您擁有的資料(兩個串列)
參考:使用 LINQ,是否可以從 Select 陳述句中輸出動態物件?如果是這樣,怎么做?
uj5u.com熱心網友回復:
由于“產品”來自外部服務,而“context.Products”來自您的資料庫。為什么不將“context.Products”與“products”連接起來,并通過應用“owner”和“price”的值來回傳“products”的屬性。
例子
var result = (from p in products
join dbP in context.Products on dbP.Id == p.Id into gj
from subDbP in gj.DefaultIfEmpty()
select new {
Owner = subDbP?.ProductOwner ?? string.Empty,
Price = subDbP?.ProductPrice ?? string.Empty,
Id = p.Id
}).ToList();
uj5u.com熱心網友回復:
這在很大程度上取決于產品的 DataType。如果這是一個串列,則有一個可用的方法,稱為ForEach。
如果您使用不同的東西,則必須在代碼中的某處撰寫擴展方法。這可能是這樣的:
public static class EnumerableExtensions
{
public static void ForEach<T>(this IEnumerable<T> values, Action<T> predicate)
{
foreach(var value in values)
{
predicate(value);
}
}
}
之后,您可以使用這種擴展方法,如 LINQ:
products.ForEach(item =>
{
var product = context.Products.Where(x => x.Id == item.Id);
item.Owner = product.Select(x => x.ProductOwner).FirstOrDefault();
item.Price = product.Select(x => x.ProductPrice).FirstOrDefault();
});
希望這可以幫助 :-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/473355.html
