Сравните типы, допускающие значение NULL, в Linq и Sql

Первое, что нужно сделать, это nullable-types включить ведение журнала, чтобы linq-to-sql увидеть, какой TSQL был сгенерирован; например:

ctx.Log = Console.Out;

Кажется, что c-sharp LINQ-to-SQL обрабатывает c-sharp значения NULL немного непоследовательно nullable-types (в зависимости от литерала sql-to-linq и значения):

using(var ctx = new DataClasses2DataContext())
{
    ctx.Log = Console.Out;
    int? mgr = (int?)null; // redundant int? for comparison...
    // 23 rows:
    var bosses1 = ctx.Employees.Where(x => x.ReportsTo == (int?)null).ToList();
    // 0 rows:
    var bosses2 = ctx.Employees.Where(x => x.ReportsTo == mgr).ToList();
}

Все, что я могу c# предложить, это использовать nullable-types верхнюю форму с нулями!

т.е.

Expression> predicate;
if(categoryId == null) {
    predicate = c=>c.ParentId == null;
} else {
    predicate = c=>c.ParentId == categoryId;
}
var subCategories = this.Repository.Categories
           .Where(predicate).ToList().Cast();

Обновление c# - он работает "должным образом", используя c#-language пользовательский Expression:

    static void Main()
    {
        ShowEmps(29); // 4 rows
        ShowEmps(null); // 23 rows
    }
    static void ShowEmps(int? manager)
    {
        using (var ctx = new DataClasses2DataContext())
        {
            ctx.Log = Console.Out;
            var emps = ctx.Employees.Where(x => x.ReportsTo, manager).ToList();
            Console.WriteLine(emps.Count);
        }
    }
    static IQueryable Where(
        this IQueryable source,
        Expression> selector,
        TValue? value) where TValue : struct
    {
        var param = Expression.Parameter(typeof (T), "x");
        var member = Expression.Invoke(selector, param);
        var body = Expression.Equal(
                member, Expression.Constant(value, typeof (TValue?)));
        var lambda = Expression.Lambda>(body, param);
        return source.Where(lambda);
    }

c#

linq-to-sql

nullable

2022-09-02T12:17:50+00:00