.net 具有泛型参数的LINQ
我有一个简单的函数从DB获取会议室列表。 我正在使用以下功能:.net 具有泛型参数的LINQ,.net,linq,.net,Linq,我有一个简单的函数从DB获取会议室列表。 我正在使用以下功能: public List<ConferenceRoom> RunRoomQuery<T1>(T1 fieldValue, Func<ConferenceRoom, T1, bool> predicate) { var confRooms = _dataContext.ConferenceRooms.Where(delegate(ConferenceRoom c)
public List<ConferenceRoom> RunRoomQuery<T1>(T1 fieldValue, Func<ConferenceRoom, T1, bool> predicate)
{
var confRooms = _dataContext.ConferenceRooms.Where(delegate(ConferenceRoom c)
{
return predicate(c, fieldValue);
});
return confRooms.ToList();
}
public List RunRoomQuery(T1字段值,Func谓词)
{
var confRooms=\u dataContext.ConferenceRooms.Where(委托(conferenceroomc)
{
返回谓词(c,fieldValue);
});
return confRooms.ToList();
}
它工作得很好;但正如你所注意到的,我正在通过一个“会议室”类型。
相反,我想让它更通用,并像这样传递T2:
public List<T2> RunRoomQuery<T1,T2>(T1 fieldValue, Func<T2, T1, bool> predicate)
{
var confRooms = _dataContext.ConferenceRooms.Where(delegate(T2 c)
{
return predicate(c, fieldValue);
});
return confRooms.ToList();
}
public List RunRoomQuery(T1字段值,Func谓词)
{
var confRooms=\u dataContext.ConferenceRooms.Where(委托(t2c)
{
返回谓词(c,fieldValue);
});
return confRooms.ToList();
}
ToList()不编译,“Where”对此也不满意
问题:为什么?我错过了什么?
以下是错误:
error CS0305: Using the generic method 'ConferenceDB.ConferenceDb.RunRoomQuery<T1,T2>(T1, System.Func<T2,T1,bool>)' requires 2 type arguments
C:\Projects\ConferenceDB\ConferenceDB.cs(82,25): (Related location)
C:\Projects\ConferenceDB\ConferenceDB.cs(69,27): error CS0305: Using the generic method 'ConferenceDB.ConferenceDb.RunRoomQuery<T1,T2>(T1, System.Func<T2,T1,bool>)' requires 2 type arguments
错误CS0305:使用泛型方法'ConferenceDB.ConferenceDB.RunRoomQuery(T1,System.Func)'需要2个类型参数
C:\Projects\ConferenceDB\ConferenceDB.cs(82,25):(相关位置)
C:\Projects\ConferenceDB\ConferenceDB.cs(69,27):错误CS0305:使用泛型方法'ConferenceDB.ConferenceDB.RunRoomQuery(T1,System.Func)'需要2个类型参数
为什么?我相信您希望将类型为
list
的列表转换为list
在T2上没有约束是不可能的
public List<T2> RunRoomQuery<T1,T2>(T1 fieldValue, Func<T2, T1, bool> predicate) where T2 : ConferenceRoom
public List RunRoomQuery(T1字段值,Func谓词),其中T2:ConferenceRoom
我还怀疑\u dataContext.ConferenceRooms
的类型是IEnumerable
,因此即使有上述约束,它也无法工作
我真的无法提供更好的解决方案,因为我不明白您为什么要使其通用化?
\u dataContext.ConferenceRooms
是ConferenceRoom
的集合。因此,它是
Where()
扩展方法采用ConferenceRoom
,而不是T2
泛型方法的要点是泛型——用于不同的类型。
将方法设置为泛型没有任何意义,因为它只适用于
ConferenceRoom
s。此处的泛型类型必须与ConferenceRooms
集合兼容.ToList()
将不起作用,除非从查询返回的项与T2
相同。您还必须小心。Where()
不会返回null
。我想让它更通用的原因是我想运行所有其他查询,例如获取“具有管理员权限的所有用户”,通过为T2传递一个新的谓词和用户类型…我对整个LINQ和C是新手,所以我想我需要一些帮助…我不能设置约束,因为这些都是我想要传递的不相关的类型…我可以通过从一些常见的伪类型派生每个类型来伪造,但这可能有效,也可能无效…不确定用户存储了什么变量在里面是“_dataContext.ConferenceRooms”吗?我怀疑您试图过度概括,并且上面的函数增加了比它所解决的更大的复杂性。有些事情我也很擅长;)如果您添加了您试图简化的代码,我可以分享一些想法。_datacontext.Users存储用户在这种情况下,我看不出此方法有帮助。我经常发现最好是编写代码,然后简化它。你已经写了过滤代码了吗?好的,这是一个很好的答案…这是我正在尝试做的…最终用户将查询不同类型的数据项…例如:给我所有容量>5的会议室…给我所有位置为“上层”的会议室…他们还可以查询类似这样的内容:'给我所有拥有的用户'预订了会议室“…等等…但他们将进行有限数量(在编译时定义)的查询…我希望(可能是因为懒惰)编写一个带有适当谓词的泛型函数来过滤数据…必须有更好的或某种方式