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
C# 泛化而不失型_C#_Linq_Linq To Sql_Generalization - Fatal编程技术网

C# 泛化而不失型

C# 泛化而不失型,c#,linq,linq-to-sql,generalization,C#,Linq,Linq To Sql,Generalization,我只需要将这两种方法合并为一种方法来概括它们。我知道IQueryable实现IEnumerable、IOrderedQueryable实现IOrderedEnumerable,如果存在第二个方法,那么第一个方法似乎是无用的。但由于某些实体框架的原因,第二个框架中断了服务器端查询转换(Linq到SQL) private static IQueryable Pag(IOrderedQueryable数据、int totalRows、int reqLength、int pageNum) { 如果(re

我只需要将这两种方法合并为一种方法来概括它们。我知道IQueryable实现IEnumerable、IOrderedQueryable实现IOrderedEnumerable,如果存在第二个方法,那么第一个方法似乎是无用的。但由于某些实体框架的原因,第二个框架中断了服务器端查询转换(Linq到SQL)

private static IQueryable Pag(IOrderedQueryable数据、int totalRows、int reqLength、int pageNum)
{
如果(reqLength==0)
返回数据;
其他的
{
int skipRows=reqLength*(pageNum-1);
如果(skipRows>=totalRows)
skipRows=0;
int diff=totalRows-skipRows;
返回数据。跳过(skipRows)。获取(diff>reqLength?reqLength:diff);
}
}
专用静态IEnumerable Pag(IORDerenumerable数据、int totalRows、int reqLength、int pageNum)
{
如果(reqLength==0)
返回数据;
其他的
{
int skipRows=reqLength*(pageNum-1);
如果(skipRows>=totalRows)
skipRows=0;
int diff=totalRows-skipRows;
返回数据。跳过(skipRows)。获取(diff>reqLength?reqLength:diff);
}
}

这些方法违反了规则,非常烦人。

即使代码看起来相同,它们也不适用于同一类型,也不能使用泛型,因为where子句只能合并多个给定值

所以,你所能做的就是考虑计算逻辑,但这是否真的更易于阅读和维护取决于你的态度

private static bool TryCalculateRange(int totalCount, int pageLength, int page, out int skip, out int take)
{
    skip = 0;
    take = 0;

    if(pageLength <= 0)
        return false;

    skip = pageLength * (page - 1);

    if(skip >= totalCount)
        skip = 0;

    take = totalCount - skip;

    if(take > pageLength)
        take = pageLength;

    return true;
}

public static IQueryable<T> Pag<T>(IOrderedQueryable<T> data, int totalRows, int reqLength, int pageNum)
{
    int skip;
    int take;

    return TryCalculateRange(totalRows, reqLength, pageNum, out skip, out take))
           ? data.Skip(skip).Take(take)
           : data;
}

public static IEnumerable<T> Pag<T>(IOrderedEnumerable<T> data, int totalRows, int reqLength, int pageNum)
{
    int skip;
    int take;

    return TryCalculateRange(totalRows, reqLength, pageNum, out skip, out take))
           ? data.Skip(skip).Take(take)
           : data;
    }
}
private static bool TryCalculateRange(int totalCount、int pageLength、int page、out int skip、out int take)
{
跳过=0;
取=0;
if(pageLength=totalCount)
跳过=0;
take=totalCount-跳过;
如果(获取>页面长度)
take=页面长度;
返回true;
}
公共静态IQueryable Pag(IOrderedQueryable数据、int totalRows、int reqLength、int pageNum)
{
整数跳跃;
int take;
返回TryCalculateRange(totalRows、requlength、pageNum、out skip、out take))
?数据。跳过(跳过)。获取(获取)
:数据;
}
公共静态IEnumerable Pag(IORDerenumerable数据、int totalRows、int reqLength、int pageNum)
{
整数跳跃;
int take;
返回TryCalculateRange(totalRows、requlength、pageNum、out skip、out take))
?数据。跳过(跳过)。获取(获取)
:数据;
}
}

代码混淆成功。学习使用自描述性变量名。也就是说,显示如何调用此代码。您需要显示一个完整、可缩小和可验证的示例,以显示EF无法在Linq中转换为SQL。此代码只是对DB查询的结果进行分页。如果linq在IQueryable集合上工作,那么LINQtoSQL的工作就是从数据库中检索所需的行。注释IQueryable方法时,代码仍然使用IEnumerable方法工作,但查询从数据库处理本身检索所有数据,而不是将作业留给数据库,从而对性能造成不利影响。为什么需要指定totalRows?。Take(diff>reqLength?reqLength:diff)Take中的条件计数是不需要的(对于IEnumerable来说是肯定的),我确信对于大多数其他数据提供者来说都是这样。它可以是Take(totalRows).Skip(…).Take(reqLength),因为如果指定的值大于可用值,则该参数是允许的。我在代码中使用了Count()。最好不要说得太过分。
private static bool TryCalculateRange(int totalCount, int pageLength, int page, out int skip, out int take)
{
    skip = 0;
    take = 0;

    if(pageLength <= 0)
        return false;

    skip = pageLength * (page - 1);

    if(skip >= totalCount)
        skip = 0;

    take = totalCount - skip;

    if(take > pageLength)
        take = pageLength;

    return true;
}

public static IQueryable<T> Pag<T>(IOrderedQueryable<T> data, int totalRows, int reqLength, int pageNum)
{
    int skip;
    int take;

    return TryCalculateRange(totalRows, reqLength, pageNum, out skip, out take))
           ? data.Skip(skip).Take(take)
           : data;
}

public static IEnumerable<T> Pag<T>(IOrderedEnumerable<T> data, int totalRows, int reqLength, int pageNum)
{
    int skip;
    int take;

    return TryCalculateRange(totalRows, reqLength, pageNum, out skip, out take))
           ? data.Skip(skip).Take(take)
           : data;
    }
}