Linq 2 SQL - универсальное предложение where - PullRequest
5 голосов
/ 12 марта 2009

Есть ли способ сделать это

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

Обратите внимание, что i.Id не существует в контексте, так как linq не знает, с каким объектом он работает, а Id является первичным ключом таблицы

Ответы [ 4 ]

4 голосов
/ 12 марта 2009

(удаленный подход привязан к атрибутам)

edit: и вот способ метамодели (так он работает как с файлами сопоставления, так и с приписанными объектами):

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);
}
2 голосов
/ 12 марта 2009

Вам нужно создать соответствующий интерфейс, от которого получаются сущности (если вы не хотите делать это с деревом выражений, как в примере Марка):

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 голосов
/ 12 марта 2009
var X = _db.table.Select(i => i.Id == id);

это вернет IQueryable

0 голосов
/ 12 марта 2009

Может быть, вы можете найти что-то в разделе Общие предикаты, на http://www.albahari.com/nutshell/predicatebuilder.aspx. Это последний раздел на странице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...