[英]Entity Framework generating a bad query
我正在使用 EntityFramework 6.3.0 in.Net 4.7.2 我在 C# 中有這個代碼
int userId = 1;
string statusValue = StatusCodes.Failing; // This is a string for anyone wondering, not an Enum
return (from statusRow in DbContext.Statuses
where statusRow.UserId == userId
&& statusRow.Status == statusValue
&& statusRow.Times > 0
orderby statusRow.CreatedAtDateTimeOffset descending
select statusRow).FirstOrDefault();
EntityFramework 正在生成此查詢
DECLARE @p__linq__0 int = 1;
DECLARE @p__linq__1 nvarchar = 'Failing';
SELECT TOP (1)
[Project1].[Id] AS [Id],
[Project1].[UserId] AS [UserId],
[Project1].[Times] AS [Times],
[Project1].[CreatedAtDateTimeOffset] AS [CreatedAtDateTimeOffset],
[Project1].[Status] AS [Status],
FROM ( SELECT
[Extent1].[Id] AS [Id],
[Extent1].[UserId] AS [UserId],
[Extent1].[Times] AS [Times], sOverridden],
[Extent1].[CreatedAtDateTimeOffset] AS [CreatedAtDateTimeOffset],
[Extent1].[Status] AS [Status],
FROM [dbo].[Statuses] AS [Extent1]
WHERE ([Extent1].[UserId] = @p__linq__0) AND (([Extent1].[Status] = @p__linq__1) OR (([Extent1].[Status] IS NULL) AND (@p__linq__1 IS NULL))) AND ([Extent1].[Times] > 0)
) AS [Project1]
ORDER BY [Project1].[CreatedAtDateTimeOffset] DESC
問題是它聲明 p__linq_1 的第二行。 它將類型設置為 nvarchar,然后 sql 服務器默認長度為 1 個字符。 因此,當有它應該找到的記錄時,查詢不會返回任何記錄。 model 中的 Status 列定義為
[StringLength(50)]
public string Status { get; set; }
[ForeignKey("Status")]
public virtual xStatus StatusValue { get; set; }
我也嘗試過 MaxLength(50) 而不是 StringLength。 但生成的查詢保持不變。
有人知道怎么修這個東西嗎?
更新:這可能與實體框架中的字符串匹配問題相同。 適用於字符串文字但不適用於字符串變量
但是使用該票證中指定的 string.Compare 也不起作用。
在我這邊進一步調試后,我發現這是我的用戶錯誤,而不是實體框架中的問題。
您可以使用以下更改強制類型為varchar
而不是 nvarchar:
[Column(TypeName = "VARCHAR")]
[StringLength(50)]
public string Status { get; set; }
通過上述更改,EF 查詢將生成參數為varchar
。
StringLength
似乎被忽略了。 這一點引起了我的興趣:
[ForeignKey("Status")]
public virtual xStatus StatusValue { get; set; }
您可以暫時將其全部或[ForeignKey]
屬性注釋掉嗎? 我知道這會破壞任何引用期望實體的 StatusValue 屬性的東西,但我可能懷疑這個 xStatus 實體的 PK 會以某種方式影響/覆蓋 Statuses 上的 Status 列。 這種關系似乎真的懷疑會有一些“類型”關聯映射到這個字符串值,而不是通過 Statuses 的 PK。
如果這樣可以修復查詢,請檢查此 xStatus 實體上的 Status 列或 PK 以查看它是否也具有[StringLength]
屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.