Как я могу запросить нулевые значения в рамках сущности? - PullRequest
107 голосов
/ 25 марта 2009

Я хочу выполнить запрос, подобный этому

   var result = from entry in table
                     where entry.something == null
                     select entry;

и получите сгенерированный IS NULL.

Отредактировано: После первых двух ответов я чувствую необходимость уточнить, что я использую Entity Framework а не Linq to SQL. Кажется, что метод object.Equals () не работает в EF.

Правка № 2: Вышеуказанный запрос работает как задумано. Он правильно генерирует IS NULL. Мой производственный код, однако, был

value = null;
var result = from entry in table
                         where entry.something == value
                         select entry;

и сгенерированный SQL был something = @p; @p = NULL. Кажется, что EF правильно переводит константное выражение, но если переменная задействована, она воспринимает это как обычное сравнение. Имеет смысл на самом деле. Я закрою этот вопрос

Ответы [ 14 ]

0 голосов
/ 04 мая 2016

Если вы предпочитаете использовать синтаксис метода (лямбда), как я, вы можете сделать то же самое, как это:

var result = new TableName();

using(var db = new EFObjectContext)
{
    var query = db.TableName;

    query = value1 == null 
        ? query.Where(tbl => tbl.entry1 == null) 
        : query.Where(tbl => tbl.entry1 == value1);

    query = value2 == null 
        ? query.Where(tbl => tbl.entry2 == null) 
        : query.Where(tbl => tbl.entry2 == value2);

    result = query
        .Select(tbl => tbl)
        .FirstOrDefault();

   // Inspect the value of the trace variable below to see the sql generated by EF
   var trace = ((ObjectQuery<REF_EQUIPMENT>) query).ToTraceString();

}

return result;
0 голосов
/ 28 ноября 2012

К сожалению, в Entity Framework 5 DbContext проблема все еще не устранена.

Я использовал этот обходной путь (работает с MSSQL 2012, но настройка ANSI NULLS может быть устаревшей в любой будущей версии MSSQL).

public class Context : DbContext
{

    public Context()
        : base("name=Context")
    {
        this.Database.Connection.StateChange += Connection_StateChange;
    }

    void Connection_StateChange(object sender, System.Data.StateChangeEventArgs e)
    {
        // Set ANSI_NULLS OFF when any connection is opened. This is needed because of a bug in Entity Framework
        // that is not fixed in EF 5 when using DbContext.
        if (e.CurrentState == System.Data.ConnectionState.Open)
        {
            var connection = (System.Data.Common.DbConnection)sender;
            using (var cmd = connection.CreateCommand())
            {
                cmd.CommandText = "SET ANSI_NULLS OFF";
                cmd.ExecuteNonQuery();
            }
        }
    }
}

Следует отметить, что это грязный обходной путь, но он может быть реализован очень быстро и работает для всех запросов.

0 голосов
/ 04 февраля 2011
var result = from entry in table    
             where entry.something == value||entry.something == null                   
              select entry;

используйте это

0 голосов
/ 07 декабря 2010

Я не могу комментировать пост divega, но среди различных решений, представленных здесь, решение divega дает лучший SQL. Как производительность, так и длина. Я только что проверил с помощью SQL Server Profiler и, посмотрев на план выполнения (с «SET STATISTICS PROFILE ON»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...