我新的EF和想從我的數據庫(SQLite的)以下列方式中的條目條款:實體框架6使用的parentid在與lambda表達式
類:
public class Customer
{
public Guid Id { get; set; }
public List<Month> Months { get; } = new List<Month>();
}
public class Month
{
public int Id { get; set; }
public string CacheId { get; set; }
public string Data { get; set; }
[Required]
public Customer Customer { get; set; }
}
的DbContext:
public DbSet<Customer> Customers { get; set; }
public DbSet<Month> Months { get; set; }
用法:
using (var context = new CustomerContext())
{
var customer = context.Customers.First();
context.Database.Log = Console.WriteLine;
var shouldContainOneEntry = context.Months.Where(x => x.Customer.Id == customer.Id).ToList();
}
shouldContainOneEntry不能爲空,但委託測試和靜態變量,而不是lambda表達式的工作:
private static Guid staticGuid;
public static bool DelegateTest(Month x)
{
return staticGuid == x.Customer.Id;
}
...
staticGuid = customer.Id;
var workingVersion = context.Months.Where(DelegateTest).ToList();
生成的SQL看起來是正確的:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[CacheId] AS [CacheId],
[Extent1].[Data] AS [Data],
[Extent1].[Customer_Id] AS [Customer_Id]
FROM [Months] AS [Extent1]
WHERE [Extent1].[Customer_Id] = @p__linq__0
-- p__linq__0: '5cfde6e0-5b3f-437b-84c8-2845b077462d' (Type = AnsiStringFixedLength, IsNullable = false)
爲什麼與拉姆達版本表情不起作用?
你是先使用代碼嗎? – Monah
必須是與SQLLite查詢提供程序相關的內容。當你執行「委託版本」時,你調用了'Enumerable.Where',這意味着整個表在內存中被讀取,然後被過濾。 「lambda版本」應該生成你已經顯示的SQL。看起來SQLLite沒有原生的'Guid'支持,並且字符串轉換可能是錯誤的。如果您直接在數據庫中執行SELECT * FROM Months WHERE Customer_Id ='5cfde6e0-5b3f-437b-84c8-2845b077462d'',會發生什麼情況? –
@Hadi Hassan:是的,我先使用代碼,生成的表看起來很好。 –