2009-03-12 18 views
5

इसLinq 2 एसक्यूएल - सामान्य जहां खंड

public T GetItemById(int id) 
{ 
    Table<T> table = _db.GetTable<T>(); 
    table.Where(t => t.Id == id); 
} 

ध्यान दें कि i.Id संदर्भ में मौजूद नहीं है LINQ क्या आपत्ति इसके साथ काम कर रहा है पता नहीं है के रूप में करने के लिए एक रास्ता है, और आईडी है तालिका

उत्तर

0
var X = _db.table.Select(i => i.Id == id); 

इस वापस आ जाएगी IQueryable < टी>

+0

हाँ लेकिन (i.Id) वर्तमान संदर्भ में मौजूद नहीं है के रूप में _db.table सामान्य है :) –

+0

आप विस्तार से बता सकते हैं आपकी विधि के उपयोग पर? –

+0

इसके बारे में भूल जाओ ... जॉन स्कीट यहाँ है :) –

4

(हटाया दृष्टिकोण गुण के लिए बाध्य)

संपादित करें: और यहाँ है मेटा मॉडल रास्ता (इसलिए यह जिम्मेदार ठहराया वस्तुओं के रूप में रूप में अच्छी तरह मानचित्रण फाइलों के साथ काम करता है):

static TEntity Get<TEntity>(this DataContext ctx, int key) where TEntity : class 
{ 
    return Get<TEntity, int>(ctx, key); 
} 
static TEntity Get<TEntity, TKey>(this DataContext ctx, TKey key) where TEntity : class 
{ 
    var table = ctx.GetTable<TEntity>(); 
    var pkProp = (from member in ctx.Mapping.GetMetaType(typeof(TEntity)).DataMembers 
        where member.IsPrimaryKey 
        select member.Member).Single(); 
    ParameterExpression param = Expression.Parameter(typeof(TEntity), "x"); 
    MemberExpression memberExp; 
    switch (pkProp.MemberType) 
    { 
     case MemberTypes.Field: memberExp = Expression.Field(param, (FieldInfo)pkProp); break; 
     case MemberTypes.Property: memberExp = Expression.Property(param, (PropertyInfo)pkProp); break; 
     default: throw new NotSupportedException("Invalid primary key member: " + pkProp.Name); 
    } 
    Expression body = Expression.Equal(
     memberExp, Expression.Constant(key, typeof(TKey))); 
    var predicate = Expression.Lambda<Func<TEntity, bool>>(body, param); 
    return table.Single(predicate); 
} 
+0

मार्क, मैं तुमसे प्यार करता हूँ। –

2

आप एक उपयुक्त इंटरफ़ेस जो संस्थाओं से निकाले जाते हैं (जब तक आप एक अभिव्यक्ति tr के साथ क्या करना चाहते हैं बनाने की आवश्यकता होगी मार्क के उदाहरण की तरह ईई):

public interface IIdentifiedEntity 
{ 
    int Id { get; } // Set as well? Depends on your situation. 
} 

तो फिर तुम लिख सकते हैं:

public T GetItemById<T>(int id) where T : class, IIdentifiedEntity 
{ 
    Table<T> table = _db.GetTable<T>(); 
    return table.Where(t => t.Id == id) 
       .Single(); 
} 
+0

uhm कृपया ध्यान दें कि यह एक वर्ग सार्वजनिक वर्ग रिपोजिटरीबेस है जहां टी: क्ला –

+0

इस दृष्टिकोण के साथ समस्या यह है कि यह केवल अंतर्निहित इंटरफ़ेस कार्यान्वयन के लिए काम करता है ... –

+0

(यानी आप IIDentifiedEntity.Id मानचित्र को Foo पर नहीं रख सकते हैं। FooID) –

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