C# 我可以创建一个接受多个表和泛型类型的泛型CompiledQuery吗?

C# 我可以创建一个接受多个表和泛型类型的泛型CompiledQuery吗?,c#,linq,linq-to-sql,c#-3.0,C#,Linq,Linq To Sql,C# 3.0,我有多个带有“id”组件的表。我希望使用LINQ从其中一个表中获取具有正确LINQ to SQL类型的项,但只使用一个CompiledQuery 下面是一个当前有效的示例。假设DBML中定义的对象类型为“myitem”,其表为“myitems” 我想这样做,其中类型可以是“myitem”、“myitems2”或我可能感兴趣的任何表和对象类型 var getOneItemAnyTable = CompiledQuery.Compile( (Table tab, Type T

我有多个带有“id”组件的表。我希望使用LINQ从其中一个表中获取具有正确LINQ to SQL类型的项,但只使用一个CompiledQuery

下面是一个当前有效的示例。假设DBML中定义的对象类型为“myitem”,其表为“myitems”

我想这样做,其中类型可以是“myitem”、“myitems2”或我可能感兴趣的任何表和对象类型

    var getOneItemAnyTable = CompiledQuery.Compile(
        (Table tab, Type T long id) => ((from anItem in tab<T>
                                              where anItem.id == id
                                              select anItem).SingleOrDefault()));
var getOneItemAnyTable=CompiledQuery.Compile(
(表选项卡,键入T long id)=>((来自选项卡中的某个项目
其中anItem.id==id
选择anItem).SingleOrDefault();
我编写这个语法是因为我不确定这里的语法应该是什么样子。如果可能的话,有什么想法吗?我是否需要使用DBML为所涉及的类型生成某种超类


谢谢。

我很确定您不能让一个编译的查询跨越多个表(如果这是您的意思的话);它怎么知道去哪里找?EF通过继承(和多个表)支持类似的内容,但即使使用继承LINQ to SQL也只支持单表区分继承

这个问题的核心与今天早些时候基本相同。棘手的一点是主键,因为这很难抽象地定义。剩下的就是
GetTable
(至少使用LINQ到SQL)

在这种情况下,您不需要超类——只是获取主键的一种方法。幸运的是,我似乎记得LINQtoSQL提供了一种实现这一点的方法(不需要使用属性,这不是LINQtoSQL的预请求);以下内容没有预编译(并且未经测试),但应该非常接近:

更新已修复并测试)

首先使用:

Foo foo = ctx.Get<Foo>(fooid);
Bar bar = ctx.Get<Bar>(barid);
Foo-Foo=ctx.Get(fooid);
Bar=ctx.Get(barid);
代码:

公共静态滴度获取(
此数据上下文(ctx、TKey)
在哪里?我是班主任
{
var table=ctx.GetTable();
var primaryKey=ctx.Mapping.GetMetaType(typeof(TItem))
.DataMembers.Where(
member=>member.IsPrimaryKey).Single().member.Name;
var item=表达式参数(typeof(TItem),“item”);
var lambda=表达式.lambda(
表达式。相等(
Expression.PropertyOrField(项,primaryKey),
表达式.常量(key,typeof(TKey)),
项目);
返回表。单个(λ);
}
公共静态TItem Get(//常见情况
此数据上下文(ctx,int键)
在哪里?我是班主任
{
返回Get(ctx,键);
}
公共静态TItem Get(//常见情况
此数据上下文(ctx,字符串键)
在哪里?我是班主任
{
返回Get(ctx,键);
}

我将看看是否能找到一种方法来预编译它…

不要这样做,而是从一个基本实体中派生出所有实体,该实体在实体中具有公共属性(如Id)。用POCO实现这些层将对您有所帮助

因为我的无知;什么是linq to sql支持的单表区分继承(更新的示例,btw)-其中表有一列,如“CustType”,对象类型由该列确定。像这样:嗯,我不知道我是否遗漏了什么,但我已经开发了一个应用程序,使用多表继承,而不使用鉴别器;有一个包含基本功能的基本实体,以及从该基本实体派生的所有其他实体。通过使用它,我创建了一个通用方法,从任何实体中获取一行。非常有趣。。。出于好奇,您使用的是属性化的元模型,还是外部(xml)元模型?为这些信息干杯(在我文章的评论中)+1.
Foo foo = ctx.Get<Foo>(fooid);
Bar bar = ctx.Get<Bar>(barid);
    public static TItem Get<TItem, TKey>(
        this DataContext ctx, TKey key)
        where TItem : class
    {
        var table = ctx.GetTable<TItem>();
        var primaryKey = ctx.Mapping.GetMetaType(typeof(TItem))
                .DataMembers.Where(
            member => member.IsPrimaryKey).Single().Member.Name;

        var item = Expression.Parameter(typeof(TItem), "item");
        var lambda = Expression.Lambda<Func<TItem, bool>>(
            Expression.Equal(
                Expression.PropertyOrField(item, primaryKey),
                Expression.Constant(key, typeof(TKey))),
                item);
        return table.Single(lambda);
    }
    public static TItem Get<TItem>( // common case
        this DataContext ctx, int key)
        where TItem : class
    {
        return Get<TItem, int>(ctx, key);
    }
    public static TItem Get<TItem>( // common case
       this DataContext ctx, string key)
       where TItem : class
    {
        return Get<TItem, string>(ctx, key);
    }