所以我使用这个LINQ查询我得到了一些非常奇怪的SQL输出。
public string GetHeaders(string header,string lec, string state)
{
string[] states = { "FL", "CA", "IN", "AL", "MI" };
string[] updatedstateslist = states.Where(x => x != state).ToArray();
var headers = (from h in db.Headers
where h.Description.Contains(header) & h.LEC == lec & !updatedstateslist.Contains(h.State)
select new
{
description = h.Description,
sic = h.SIC,
yphv = h.YPHV,
state = h.State
});
SQL OutPut正在推出
SELECT
1 AS [C1],
[Extent1].[Description] AS [Description],
[Extent1].[SIC] AS [SIC],
[Extent1].[YPHV] AS [YPHV],
[Extent1].[State] AS [State]
FROM [dbo].[Headers] AS [Extent1]
WHERE ([Extent1].[Description] LIKE @p__linq__0 ESCAPE N'~')
AND (([Extent1].[LEC] = @p__linq__1) OR (([Extent1].[LEC] IS NULL) AND (@p__linq__1 IS NULL)))
AND ( NOT (([Extent1].[State] IN (N'FL', N'CA', N'AL', N'MI')) AND ([Extent1].[State] IS NOT NULL)))
奇怪的特定部分是(@ p__linq__1 IS NULL)
我无法弄清楚LINQ的哪一部分会导致出现一个小部分。如果我知道我可以重写Linq以避免发生这种情况。
答案 0 :(得分:3)
这里没有问题,框架正在做正确的事情。
它必须转换C#谓词
h.LEC == lec
成为SQL等价物。
SQL的一个有趣的怪癖是谓词NULL = NULL
求值为NULL
,当转换为布尔值时,它变为false
。 (see this question)
因此框架必须将其转换为sql谓词,以确定它们是否都具有相等的值,或者都是null。如果你必须手工编写,你最终会写同样的东西:
([Extent1].[LEC] = @p__linq__1)
OR
(([Extent1].[LEC] IS NULL) AND (@p__linq__1 IS NULL)))