2015-07-24 1 views
0

У меня есть Entity, который имеет столбцы varchar и text (тип базы данных Text/CLOB).Linq может извлекать отдельные объекты, которые имеют свойства text/clob?

Следующий запрос не работает, поскольку MyEntity имеет столбцы Clob (Oracle). Подобное поведение ожидается в SqlServer с его столбцами Text.

var query = from e in ctx.MyEntity select e.Distinct() 

Как я могу использовать Linq для retrive различных строки из этой таблицы/сущностей?

Примечание: Я не могу использовать «varchar (max) SqlServer»; он должен быть «текстовым» типом; потому что в других СУБД, таких как Oracle, нет типа varchar (max).

Моя проблема связана с совместимостью SqlServer и Oracle с Linq/Entity Framework.

Note2: Мне нужны объекты типа MyEntity в выделении, а не общие типы и другие типы.

Я ценю любые предложения. Благодарю.

+0

В Sql Server вы можете использовать 'DISTINCT' с' SUBSTRING' поля 'Text'. Я не знаю, относится ли это также к CLOB. –

+0

Проверьте это - http://stackoverflow.com/a/10720079/1559611, здесь вы создаете анонимный тип и используете Distinct для получения ответа, затем проверьте это http://stackoverflow.com/a/10720540/1559611, так как вы должны переопределить метод GetHashCode и Equals в результирующем типе, чтобы гарантировать, что Distinct действительно функционирует должным образом. В настоящее время будет проведено сравнение ссылок на объекты, что не поможет достичь желаемого результата. Я могу представить пример кода, если его неясный –

+0

@GertArnold, Да, это также относится к CLOB. Поэтому подстрока ограничивает CLOB только 4000 символами. Это потому, что я предпочитаю строить соединение. –

ответ

0

Ниже то, что вам нужно, чтобы попытаться достичь, вы можете, конечно, работать с POCO

Позвольте мне определить окончательный заказ POCO Type - CustomEntity, который имеет несколько соответствующих полей из оригинального источника, вы, конечно, нужно измените согласно вашему требованию. Нужно добавить больше полей, чтобы достичь конечного результата

public class CustomEntity : IEquatable<CustomEntity> 
{ 
    public int Id {get; set;} 

    public string Name {get; set;} 

    public string ClobText {get; set;} 

    public bool Equals(CustomEntity other) 
    { 
     //Check whether the compared object is null. 
     if (Object.ReferenceEquals(other, null)) return false; 

     //Check whether the compared object references the same data. 
     if (Object.ReferenceEquals(this, other)) return true; 

     //Check whether the CustomEntity properties are equal. 
     return Id.Equals(other.Id) && Name.Equals(other.Name) &&  
       ClobText.Equals(other.ClobText); 
    } 

// If Equals() returns true for a pair of objects 
// then GetHashCode() must return the same value for these objects. 

public override int GetHashCode() 
{ 
    // Get hash code for the Id field 
    int hashProductId = Id.GetHashCode(); 

    // Get hash code for the Name field if it is not null 
    int hashProductName = Name == null ? 0 : Name.GetHashCode(); 

    // Get hash code for the field if it is not null 
    int hashProductClobText = ClobText == null ? 0 : ClobText.GetHashCode();   

    //Calculate the hash code for the CustomEntity object 
    return hashProductName^hashProductCode^hashProductClobText; 
    } 

} 

Теперь следующий поможет вам достичь конечного результата:

var query = ctx.MyEntity.Select(x=>new CustomEntity 
             { 
             Id = x.Id, 
             Name = x.Name, 
             ClobText = x.ClobText 
             } 
           ).Distinct(); 

Я надеюсь, что это уточнить, дайте мне знать, если дополнительно требуется помощь в решении вопрос

+0

Теперь у вас есть 'IEnumerable ', а не 'IEnumerable '. Кроме того, ваше решение извлекает * все * строки из базы данных и делает клиентскую часть части «DISTINCT». Это может быть убийца производительности. – sloth

+0

Согласовано, теперь у нас есть IEnumerable , на самом деле то же самое можно сделать и в классе MyEntity, но да, он делает все в памяти памяти, что может иметь свои проблемы, связанные с производительностью, но в моем понимании для IQueryable также аналогичная реализация может быть выполнена, важная часть переопределяет методы Equals и GetHashCode, которые OP необходимо реализовать и является причиной неправильного ответа в исходном решении. –

+0

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

Смежные вопросы