我想在我的 LINQ 函式中使用 async 和 await 函式,但我不這樣做。我有兩個表 Order 和 Product 我想加入它們并DataGridView使用異步彈出。
這是我的異步函式。
我的串列定義是:
List<OrderDTO> transactionByDate;
和我的功能:
private async Task<List<OrderDTO>> GetTransactionByDate(DateTime today)
{
return await Task.Factory.StartNew(() =>
{
using (Db db = new Db())
{
var totalOrder = (from u in db.Orders
join p in db.Product on u.ProductId equals p.ProductId
where u.OrderDate == today
select new OrderDTO
{
OrderId = u.OrderId,
ProductName = p.ProductName,
Date = u.OrderDate,
Price = u.Price,
}).OrderByDescending(x => x.Date).ToList();
return totalOrder;
}
});
}
然后在我的按鈕事件中:
private async void button1_Click(object sender, EventArgs e)
{
transactionByDate = await GetTransactionByDate(today);
dgvTransactions.DataSource = transactionByDate;
}
我得到的錯誤是:
無法在 LINQ to Entities 查詢中構造物體或復雜型別“OrderDTO”。
我真的不知道如何從我的異步GetTransactionByDate(today)函式回傳。如果您能幫助我,我將不勝感激,我是這種編碼的新手。
uj5u.com熱心網友回復:
我無法測驗它,因為它不能在本地編譯(顯然),但我認為你可以這樣做:
private async Task<List<OrderDTO>> GetTransactionByDate(DateTime today)
{
return await Task.Factory.StartNew(() =>
{
using (Db db = new Db())
{
var totalOrder = (from u in db.Orders
join p in db.Product on u.ProductId equals p.ProductId
where u.OrderDate == today
select new
{
OrderId = u.OrderId,
ProductName = p.ProductName,
Date = u.OrderDate,
Price = u.Price
})
.ToList();
var result = totalOrder.Select(ano =>
new OrderDTO
{
OrderId = ano.OrderId,
ProductName = ano.ProductName,
Date = ano.OrderDate,
Price = ano.Price,
})
.OrderByDescending(x => x.Date)
.ToList();
return result;
}
}
}
uj5u.com熱心網友回復:
關鍵是將資料庫上發生的事情和記憶體中發生的事情分開。
不過,在你開始之前,我會創建一個很好的輔助函式來取出一些樣板代碼。
private async Task<List<T>> GetDtosAsync<T>(Func<Db, List<T>> getDtos) =>
await Task.Run(() =>
{
using (Db db = new Db())
{
return getDtos(db);
}
});
請注意,我使用Task.Run的 asTask.Factory.StartNew已過時,不再推薦。
現在你可以這樣寫你的方法:
private async Task<List<OrderDTO>> GetTransactionByDate(DateTime today) =>
await GetDtosAsync(db =>
{
var query =
from u in db.Orders
join p in db.Product on u.ProductId equals p.ProductId
where u.OrderDate == today
select new
{
u.OrderId,
p.ProductName,
u.OrderDate,
u.Price,
};
var totalOrder =
query
.ToList()
.Select(x => new OrderDTO
{
OrderId = x.OrderId,
ProductName = x.ProductName,
Date = x.OrderDate,
Price = x.Price,
})
.ToList();
return totalOrder;
});
query.ToList()在您構建最終串列之前,它會從資料庫中獲取資料并將其帶入記憶體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/443390.html
上一篇:應用程式無法在另一臺帶有SerialPort的機器上正常作業
下一篇:當我在form_load中制作一個點矩陣時它可以作業,但是當我在一個單獨的類中制作它并在form_load中制作它的一個物件時它不起作用
