LINQ奇怪的SQL输出

时间:2014-05-20 23:00:59

标签: c# linq

所以我使用这个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以避免发生这种情况。

1 个答案:

答案 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)))