पर जाओ और बनाने के एक LINQ Provider (मुझे यकीन है कि तुम वैसे भी यह करने के लिए, नहीं करना चाहती हूँ)।
यह बहुत काम है, तो शायद आप NHibernate या Entity Framework या ऐसा कुछ उपयोग करना चाहते हैं।
यदि आपके प्रश्न सरल हैं, तो आपको एक पूर्ण उड़ा LINQ प्रदाता की आवश्यकता नहीं है। Expression Trees पर देखें (जो LINQ प्रदाता द्वारा उपयोग किया जाता है)।
आप हैक कर सकते हैं कुछ इस तरह:
public static class QueryExtensions
{
public static IEnumerable<TSource> Where<TSource>(this Repo<TSource> source, Expression<Func<TSource, bool>> predicate)
{
// hacks all the way
dynamic operation = predicate.Body;
dynamic left = operation.Left;
dynamic right = operation.Right;
var ops = new Dictionary<ExpressionType, String>();
ops.Add(ExpressionType.Equal, "=");
ops.Add(ExpressionType.GreaterThan, ">");
// add all required operations here
// Instead of SELECT *, select all required fields, since you know the type
var q = String.Format("SELECT * FROM {0} WHERE {1} {2} {3}", typeof(TSource), left.Member.Name, ops[operation.NodeType], right.Value);
return source.RunQuery(q);
}
}
public class Repo<T>
{
internal IEnumerable<T> RunQuery(string query)
{
return new List<T>(); // run query here...
}
}
public class TestModel
{
public int Id { get; set; }
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
var repo = new Repo<TestModel>();
var result = repo.Where(e => e.Name == "test");
var result2 = repo.Where(e => e.Id > 200);
}
}
कृपया इस का उपयोग नहीं करते के रूप में यह है। यह सिर्फ एक त्वरित और गंदा उदाहरण है कि एसक्यूएल स्टेटमेंट बनाने के लिए अभिव्यक्ति पेड़ों का विश्लेषण कैसे किया जा सकता है।
न सिर्फ Linq2Sql, NHibernate या EntityFramework ... का उपयोग क्यों
http://www.linqpad.net/ आप मदद कर सकता है। –
आपको ओ/आरएम फ्रेमवर्क का उपयोग करना चाहिए जो LINQ से SQL या Entity Framework जैसे अभिव्यक्तियों पर LINQ को सक्षम बनाता है। – Steven
क्या आप एक [क्वेरी प्रदाता] (http://msdn.microsoft.com/en-us/library/system.linq.iqueryprovider.aspx) को कार्यान्वित करना चाहते हैं? – phg