Linq to SQL генерирует сравнение строк

Учитывая следующие классы,

public class MyClass
{
    public string Property { get; set; } //mapped to column 'property'
}

public class MyContext : DbContext
{
    public DbSet<MyClass> MyClasses { get; set; } //mapped to table dbo.MyClasses
}

Я пытаюсь сгенерировать следующий запрос SQL, используя Linq to SQL и EF Core 3.1.

SELECT * FROM dbo.MyClasses
WHERE property > 'constant'

Любая помощь приветствуется.


Попытка 1:

var result = dbContext.MyClasses.Where(c => c.Property > "constant").ToList();

//Does not compile

Попытка 2:

var result = dbContext.MyClasses.Where(c => c.Property.CompareTo("constant") > 0).ToList();

//SELECT * FROM dbo.MyClasses
//WHERE
//CASE                                                
//  WHEN property  = 'constant' THEN 0  
//  WHEN property  > 'constant' THEN 1  
//  WHEN property  < 'constant' THEN -1    
//END > 0

person Romain Vergnory    schedule 13.01.2020    source источник
comment
Linq to SQL, Entity Framework и EF Core 3 - это разные вещи. Удалите два неверных тега (т.е. оставьте только EF Core). Удалите также терминологию LINQ to SQL из вопроса.   -  person mjwills    schedule 13.01.2020
comment
Попытка 2 не дает тех же результатов, даже если SQL отличается?   -  person Magnetron    schedule 13.01.2020
comment
Основная проблема заключается в том, что тип string data не определяет операторы сравнения, поэтому вы должны использовать методы string.Compare или string.CompareTo, которые в настоящее время не имеют хорошей трансляции SQL. Либо примите текущий неэффективный перевод и подождите, пока RF Core улучшит его в какой-то будущей версии, либо используйте решение / обходной путь из моего ответа на сообщение, отмеченное как дублирующееся.   -  person Ivan Stoev    schedule 13.01.2020


Ответы (1)


В качестве альтернативы вы можете использовать необработанный SQL:

var id = 1;
dbContext.MyClasses
    .FromSqlInterpolated("SELECT * FROM dbo.MyClasses WHERE property > {id}")
    .ToList<MyClass>();

Дополнительную информацию можно найти здесь.

person StepUp    schedule 13.01.2020
comment
new SqlParameter("@id", 1) создает параметр, параметр SqlDbType которого равен 1 (двоичный), без какого-либо значения. Перечисления - это, по сути, целые числа с тегами, поэтому SqlParameter (string, System.Data.SqlDbType) лучше подходит для этого вызова, чем SqlParameter(string,Object) - person Panagiotis Kanavos; 13.01.2020
comment
@PanagiotisKanavos спасибо за отличный комментарий. Я обновил свой ответ немного другим решением. Спасибо! - person StepUp; 13.01.2020
comment
@PanagiotisKanavos большое спасибо, я обновил ответ! :) - person StepUp; 13.01.2020