Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 具有泛型参数的LINQ_.net_Linq - Fatal编程技术网

.net 具有泛型参数的LINQ

.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)

我有一个简单的函数从DB获取会议室列表。 我正在使用以下功能:

    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的会议室…给我所有位置为“上层”的会议室…他们还可以查询类似这样的内容:'给我所有拥有的用户'预订了会议室“…等等…但他们将进行有限数量(在编译时定义)的查询…我希望(可能是因为懒惰)编写一个带有适当谓词的泛型函数来过滤数据…必须有更好的或某种方式