2012-01-21 5 views
0

Привет всем Мне нужно несколько идей, как исправить порядок по элементу карты с элементами с нулевым значением.nhibernate map item order issue

Я пытаюсь сделать сортировку

IQueryable<Device> q; 
q = from d in q 
orderby d.Attributes[1] 
orderby d.Name 
select d; //<-- return only devices where device_attrib_value (d.Attributes[1]) 
//not null 

Проблема в результате запроса его не возвращают элементы без device_attrib_value.If смотреть вниз вы можете увидеть SQL я думаю, что это неправильно becouse должно быть некоторое выражение объединения.

Вопрос: Как я могу изменить выражение или отображение linq, чтобы обеспечить хорошую сортировку атрибутов? Мне это нужно для динамических колонок в моей сетке с сортировкой и фильтрацией

Цените любую помощь или идеи!

Database

Simple database

Mapping файл

< class name="Device" table="DEVICES" lazy="false"> 
    <id name="Id"> 
     <column name="ID" /> 
     <generator class="native" /> 
    </id>  
    <property name="Name" column="NAME"/>  
    <map name="Attributes" table="DEVICE_ATTRIB_VALUES"> 
     <key column="DEVICE_ID" not-null="true"/> 
     <index column="ATTRIB_ID" type="System.Int64" /> 
     <element column="VALUE" type="System.String"/> 
    </map>  
    </class> 

Класс сущностей Устройство

public class Device 
{   
    public virtual long Id { get; set; } 
    public virtual string Name { get; set; }   
    public virtual IDictionary<long, string> Attributes { get; set; }   
} 

Sql порождена NHibernate

select 
     device0_.ID as ID1_, 
     device0_.NAME as NAME1_ 
    from 
     DEVICES device0_, 
     DEVICE_ATTRIB_VALUES attributes1_ 
    where 
     device0_.ID=attributes1_.DEVICE_ID 
     and attributes1_.ATTRIB_ID = @p0 
    order by 
     attributes1_.VALUE asc, 
     device0_.NAME asc; 

ответ

0

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

+0

привет спасибо за ответ, но мне нужно вернуть IQueryable q. –

+0

, если включить d.Attributes в списке выбора, q будет формировать оператор sql, который включает столбцы в DEVICE_ATTRIB_VALUES, которые вам нужны для сортировки и подкачки и фильтрации. –

+0

Ваш код даже не компилируется –

0

Если вы можете заменить карту с мешком в вашем отображении, то я могу предложить следующее решение:

public class Attrib 
{ 
    public virtual long Id { get; set; } 
    public virtual string Value { get; set; } 
} 

<class name="Device" table="DEVICES" lazy="false"> 
... 
    <bag name="Attributes" table="DEVICE_ATTRIB_VALUES"> 
     <key column="DEVICE_ID" not-null="true"/> 
     <composite-element class="Attrib"> 
      <property name="Id" column="ATTRIB_ID" type="System.Int64" /> 
      <property name="Value" column="VALUE" type="System.String"/> 
     </composite-element> 
    </bag> 
... 
</class> 

и это LINQ QUERTY будет включать в себя устройства, даже если они не имеют указанный атрибут

session.Query<Device>().OrderBy(d => d.Attributes.Where(a => a.Id == 1).Select(a => a.Value)).ToList(); 

этот запрос производит следующий SQL

select 
    device0_.ID as ID0_, 
    device0_.NAME as NAME0_ 
from 
    DEVICES device0_ 
order by 
    (select 
     attributes1_.VALUE 
    from 
     DEVICE_ATTRIB_VALUES attributes1_ 
    where 
     device0_.ID=attributes1_.DEVICE_ID 
     and [email protected]) asc; 

Надежда эта помощь вы найдете более элегантное решение.