2011-01-20 28 views
5

NHibernate kullanıyorum ve bu sorguyla ilgili sorun yaşıyorum ... ID'sini kullanarak almak istediğim bir sınıf Öğem var. Her şey yolunda. Ancak, başka bir koşul ayarlanmışsa, Öğe sınıfında bir bool özelliğinin true olarak ayarlanmasını istiyorum. Özel olarak, bu özelliğin, Öğenin işaretlenen kullanıcı için işaretli/işaretli/işaretli olup olmadığını ve bu bilginin Öğe ve Kullanıcı arasındaki ilişkiyi belirten bir tabloda belirlendiğini isimlendirmek üzere IsMarked olarak adlandırılır.NHibernate sorgusunda farklı tabloya göre ayar değeri

Şu anda Öğeyi getiriyorum ve daha sonra başvuruyu bulabilirim - referans bulunamadıysa özelliği true olarak güncelleyerek. Bunu bir sorguda yapabilir miyim?

var item = Session.Get<Item>(itemId); 

var flaggedResult = Session.CreateCriteria<ItemWithUserFlag>() 
    .Add(Restrictions.Eq("User.Id", userId)) 
    .Add(Restrictions.Eq("Item", item)) 
    .List<ItemWithUserFlag>(); 

if (flaggedResult.Count > 0) 
    item.IsMarked = true; 

return item; 
+0

nasıl sınıfları eşleştirilir? Kullanıcı ve Öğe arasında çoktan fazlasına bir ifade var mı? –

+0

Eşleştirmeler için Akıcı kullanıyorum. Ayrı bir sınıf ItemWithUserFlag ile temsil edilen çoktan çoğa ilişkisi vardır. Kullanıcının Ürün ile doğrudan bir ilişkisi yoktur ve Ürün'ün Kullanıcı ile doğrudan bir ilişkisi yoktur. ItemWithUserFlag, Kullanıcı ve Öğe olarak ayarlanmış bir Referansa sahiptir. – stiank81

cevap

7

Nasıl mülkiyet eşlemenizde filter birlikte formula kullanma hakkında:

<property name="IsMarked" formula="(select count(*) from ItemWithUserFlag where ItemWithUserFlag.ItemId = ItemId and ItemWithUserFlag.UserId = :UserFilter.userId)" /> 

Ve def filtre: gibi bir şey neden olacaktır

<filter-def name="UserFilter"> 
    <filter-param name="userId" type="Int32"/> 
</filter-def> 

SELECT Item.*, (select count(*) from ItemWithUserFlag where ItemWithUserFlag.ItemId = Item.ItemId and ItemWithUserFlag.UserId = ?) AS IsMarked FROM Item 

IsMarked bool olarak tanımlandığı sürece, count(*)0 değerini döndürürse false'a dönüştürülür ve > 0'a dönüştürülürse true'a dönüştürülür.

DÜZENLEME: Akıcı gösterimi

public class ItemMap : ClassMap<Item> 
{ 
    public ItemMap() 
    { 
     /// ... whatever 
     Map(x => x.IsMarked).Formula("(select count(*) from ItemWithUserFlag where ItemWithUserFlag.ItemId = ItemId and ItemWithUserFlag.UserId = :UserFilter.userId)"); 
    } 
} 

public class UserFilter : FilterDefinition 
{ 
    public UserFilter() 
    { 
     WithName("UserFilter") 
      .AddParameter("userId", NHibernate.NHibernateUtil.Int32); 
    } 
} 
+0

Thx! Henüz test edilmedim, ama bu işe yarayacak gibi geliyor. Benim durumumda sorun, mapalar için FluentNhibernate kullanıyorum. Dunno, bazı eşlemeleri i xml'yi aynı anda tanımlayabilir veya aynı şekilde Akıcı olarak ifade edilebilir. Yani, bunu doğrudan sorguda elde etmenin bir yolu yok mu? – stiank81

+0

@ stiank81 Ben Fluent ile çalışması gerektiğine inandığım şeyi ekledim. –

+0

@ stiank81 Sorguda bunu başarmak hakkında: Hiçbir şekilde bir yol olmadığını düşünüyorum. Mantıksal olarak, istediğiniz şey bir kısıtlama ya da neyin değil, hesaplanan bir sütun olmasıdır, bu yüzden eşleme yoluyla yapılması gerektiğini düşünüyorum. Ama ben nHibernate konusunda böyle bir uzman değilim ve bu yüzden emin olamadım. Düzenleme için –

İlgili konular