C# 泛型方法和谓词的问题

C# 泛型方法和谓词的问题,c#,linq,C#,Linq,我目前有这种通用方法: public virtual T Get(Expression<Func<T, bool>> predicate) { return this.Query.Where(predicate).FirstOrDefault(); } 我真的不太了解泛型,我需要做的是有一个方法,将partitionKey和rowKey作为参数并执行Get。大概是这样的: ST = testTable.Get(pkey,rkey)

我目前有这种通用方法:

    public virtual T Get(Expression<Func<T, bool>> predicate)
    {
        return this.Query.Where(predicate).FirstOrDefault();
    }
我真的不太了解泛型,我需要做的是有一个方法,将partitionKey和rowKey作为参数并执行Get。大概是这样的:

ST = testTable.Get(pkey,rkey);

有没有人知道我是如何做到这一点的?

您需要创建一个函数,该函数接受这些参数,并使用使用参数的lambda表达式调用第一个函数

public T Get(pkey,rkey)
{
    return Get(u => u.PartitionKey == pKey & u.RowKey == rKey);
}

如果
T
不受继承具有这些属性的类型的约束,则需要创建一个扩展方法,使用具有这些属性的类型参数扩展类。

需要创建一个函数,该函数接受这些参数,并使用使用使用这些参数的lambda表达式调用第一个函数

public T Get(pkey,rkey)
{
    return Get(u => u.PartitionKey == pKey & u.RowKey == rKey);
}
如果
T
不受继承具有这些属性的类型的约束,则需要创建一个扩展方法,使用具有这些属性的类型参数扩展类

有没有人知道我是怎么做到的

是的,但我不会命名方法
Get
。我会这样做:

public T GetByPartitionKeyAndByRowKey<T>(int partitionKey, int rowKey) {
    return Get(u => u.PartitionKey == partitionKey && rowKey == rowKey);
}
public T getByPartitionKey和ByRowKey(int-partitionKey,int-rowKey){
返回Get(u=>u.PartitionKey==PartitionKey&&rowKey==rowKey);
}
我假设域类上的两个属性
PartitionKey
RowKey
,是
int
。你可以相应地改变

我想知道你为什么要用泛型。它看起来像是一个实例方法,看起来像是在某个表中调用,该表可能实现了
IEnumerable
,用于一些
T
具有
PartitionKey
RowKey
。如果你总是这样做,这就是泛型的意义所在

另外,为什么这种方法是虚拟的

有没有人知道我是怎么做到的

是的,但我不会命名方法
Get
。我会这样做:

public T GetByPartitionKeyAndByRowKey<T>(int partitionKey, int rowKey) {
    return Get(u => u.PartitionKey == partitionKey && rowKey == rowKey);
}
public T getByPartitionKey和ByRowKey(int-partitionKey,int-rowKey){
返回Get(u=>u.PartitionKey==PartitionKey&&rowKey==rowKey);
}
我假设域类上的两个属性
PartitionKey
RowKey
,是
int
。你可以相应地改变

我想知道你为什么要用泛型。它看起来像是一个实例方法,看起来像是在某个表中调用,该表可能实现了
IEnumerable
,用于一些
T
具有
PartitionKey
RowKey
。如果你总是这样做,这就是泛型的意义所在

另外,为什么这个方法是虚拟的

public virtual T Get(string pkey, string rkey)
{
    return this.Query.Where(u=>u.PartitionKey == pkey && u.RowKey==rkey).FirstOrDefault();
}
像这样的

public virtual T Get(string pkey, string rkey)
{
    return this.Query.Where(u=>u.PartitionKey == pkey && u.RowKey==rkey).FirstOrDefault();
}


我正在为许多不同的表执行此操作,因此通用表工作良好。只需要编写一次代码。谢谢您的回答。@Marianne:那么您必须添加一个约束,使编译器能够推断
T
具有属性
PartitionKey
RowKey
。谢谢Jason。我很抱歉,但可以给我一些建议或东西,我可以看看,这样我就会明白如何做这件事。我确实添加了一条评论,但似乎不在这里。我在AzureTableBase中所说的是T,这就是所显示的。
public virtual T Get(表达式谓词),其中T:SomeBaseClass或interfacethat具有属性NamedPartitionKeyandrowkey{…}
Hello。我尝试了:public T getByPartitionKey和ByRowKey(string partitionKey,string rowKey),其中T:Microsoft.WindowsAzure.StorageClient.TableServiceEntity{return Get(u=>u.partitionKey==partitionKey&&rowKey==rowKey);}它总是在“where”之后为T表示“无法解析T”。请注意,我还创建了另一个名为tableBase的类,并将其放在:。这仍然没有帮助。我正在为许多不同的表执行此操作,因此通用表工作良好。只需要编写一次代码。谢谢您的回答。@Marianne:那么您必须添加一个约束,使编译器能够推断
T
具有属性
PartitionKey
RowKey
。谢谢Jason。我很抱歉,但可以给我一些建议或东西,我可以看看,这样我就会明白如何做这件事。我确实添加了一条评论,但似乎不在这里。我在AzureTableBase中所说的是T,这就是所显示的。
public virtual T Get(表达式谓词),其中T:SomeBaseClass或interfacethat具有属性NamedPartitionKeyandrowkey{…}
Hello。我尝试了:public T getByPartitionKey和ByRowKey(string partitionKey,string rowKey),其中T:Microsoft.WindowsAzure.StorageClient.TableServiceEntity{return Get(u=>u.partitionKey==partitionKey&&rowKey==rowKey);}它总是在“where”之后为T表示“无法解析T”。请注意,我还创建了另一个名为tableBase的类,并将其放在:。这仍然没有帮助。这是否会检索所有数据,然后进行筛选?这取决于查询绑定到的对象。这是否会检索所有数据,然后进行筛选?这取决于查询绑定到的对象。我尝试了此操作,但收到消息说“无法解析PartitionKey”和“无法解析RowKey”@玛丽安:
T
没有这些属性。您需要约束
T
或创建一个扩展方法。如何约束T。我想我以前听说过,但不确定如何做。如果有帮助的话,当我在AzureTableBase中单击时,它会显示T。希望您能建议如何约束。thanksI尝试了此操作,但收到消息说“无法解析PartitionKey”和“无法解析RowKey”@Marianne:
T
没有这些属性。您需要约束
T
或创建一个扩展方法。如何约束T。我想我以前听说过,但不确定如何做。如果有帮助的话,当我在AzureTableBase中单击时,它会显示T。