2012-06-06 10 views
6

का उपयोग करके केवल दिन भाग तुलना के साथ तारीख तक रिकॉर्ड्स प्राप्त करना मैं उन रिकॉर्ड्स से कितना समय जुड़ा हुआ हूं, इससे कोई फर्क नहीं पड़ता कि मैं किसी विशेष दिन से सभी रिकॉर्ड प्राप्त करना चाहता हूं। अब तक मैं इस तरह विधि है:nhibernate

public IEnumerable<Record> QueryByDay(DateTime day) 
{ 
    return repository.Table 
     .Where(t => t.MyDate.Date == day.Date); 
} 

स्पष्ट रूप से अधिक पठनीय है और अधिक साफ लगता है कौन सा:

public IQueryable<Record> QueryByDay(DateTime day) 
{ 
    DateTime from = day.Date; 
    DateTime to = day.Date.AddDays(1); 

    return repository.Table 
     .Where(t => t.MyDate >= from && t.MyDate < to); 
    } 

लेकिन LINQ करने वाली वस्तु हम कर सकते हैं में (यह मानते हुए टेबल अब कुछ संग्रह है) । मैं सोच रहा था कि डेटाबेस स्टोरेज और निबर्ननेट का उपयोग कर पहली विधि लिखने का बेहतर तरीका है या नहीं?

+0

मुझे विश्वास है कि आपने जिस फॉर्म को एल 2 ओ के लिए उपयोग किया है वह एनएच के साथ ठीक है। –

+0

@ डिएगो मिजेलशोन क्या आप मुझे बता सकते हैं कि एनएचबर्ननेट का कौन सा कथन आप इसका उपयोग कर रहे हैं? प्रोजेक्ट में मैं काम कर रहा हूं हम वी 2.1 का उपयोग कर रहे हैं और यह NHibernate.QueryException फेंक रहा है। – 0lukasz0

+1

2.1 3 साल पुराना और असमर्थित है। 3.3 वर्तमान स्थिर रिलीज है। –

उत्तर

6

के रूप में कहा टिप्पणी में, अपने LINQ क्वेरी एनएच 3.3 के साथ ठीक काम करता है।

पहले के रिलीज में, आप HQL का उपयोग कर सकते हैं:

return session.CreateQuery("from MyClass where date(MyDate) = :day") 
       .SetParameter("day", day.Date) 
       .List<MyClass>(); //executes 

आप भी मानदंड से date समारोह का उपयोग कर सकते SqlFunction के माध्यम से। यह अधिक गड़बड़ है, लेकिन अधिक गतिशील प्रश्नों को बनाने की अनुमति देता है:

return session.CreateCriteria<Foo>() 
       .Add(Restrictions.Eq(
         Projections.SqlFunction("date", 
               NHibernateUtil.Date, 
               Projections.Property("MyDate")), 
         day.Date)) 
       .List<MyClass>(); //executes 
2
public IEnumerable<Record> QueryByDay(DateTime day) 
{ 
    return repository.Table 
     .Where(t => t.MyDate.Day == day.Day && t.MyDate.Month == day.Month && t.MyDate.Year == day.Year); 
} 
+0

में काम करता है क्या आप मुझे बता सकते हैं कि एनएचबर्ननेट का कौन सा कथन आप इसका उपयोग कर रहे हैं? प्रोजेक्ट में मैं काम कर रहा हूं हम वी 2.1 का उपयोग कर रहे हैं और यह NHibernate.QueryException फेंक रहा है। – 0lukasz0

+1

ओह! v2.1 लिंकक का समर्थन नहीं करता है लेकिन लिंक प्रदाता के साथ एक शाखा है, जिसने काम नहीं किया है। संस्करण 3+ में देशी लिंक प्रदाता शामिल है। जैसा कि @ डिएगो मिशेलसन ने बताया, "2.1 3 साल पुराना और असमर्थित है। 3.3 वर्तमान स्थिर रिलीज है।" – ivowiblo

+0

ठीक है, मैं यह +1 देता हूं हालांकि कुछDateAttr.Date == अन्य दिनांक। दिनांक एनएच 3+ में काम करता है तो यह मेरी राय में बेहतर दृष्टिकोण है। – 0lukasz0

2

यह LINQ प्रदाता पर निर्भर करता है। मुझे यकीन नहीं है कि क्या NHibernate LINQ प्रदाता item.SomeDateProperty.Date == x वाक्यविन्यास का समर्थन करता है और मुझे संदेह है कि यह करता है। लेकिन, आप तो जैसे अपने खुद के विस्तार विधि बना सकते हैं:

public static IQueryable<T> FilterByDate(this IQueryable<T> This, Expression<Func<T, DateTime>> getProperty, DateTime date) 
{ 
    DateTime from = day.Date; 
    DateTime to = day.Date.AddDays(1); 
    return This.Where(x=> 
    Expression.And(
     Expression.GreaterThan(getProperty, Expression.Variable(from)), 
     Expression.LessThan(getProperty, Expression.Variable(to))); 

} 

इस तरह के निर्माण के लिए नहीं जा रहा है कि अभी है - बस तुम्हारा साथ क्या करना है की एक विचार देने के लिए कोशिश कर रहा था।

फिर आप यह इतना की तरह उपयोग कर सकते हैं:

var result = repository.Table.FilterByDate(x=>x.MyDate, new DateTime(2012, 6,6)); 
+0

+1, मुझे यह विचार पसंद है, हालांकि एनएचबीर्नेट अधिक अद्यतित समाधानों का समर्थन करता है। – 0lukasz0

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^