C# 选择按三个选项计数ObjectDataSource

C# 选择按三个选项计数ObjectDataSource,c#,asp.net,C#,Asp.net,我需要GetUsers的计数,但我有3种不同的计算方法,分别是alpha、search和byEmail参数。在这种情况下,我可以为ObjectDataSource SelectCount方法做什么 public class Users { public IList<MembershipUser> GetUsers(string alpha, string search, bool byEmail, int startRowIndex, int maximumRows)

我需要GetUsers的计数,但我有3种不同的计算方法,分别是alpha、search和byEmail参数。在这种情况下,我可以为ObjectDataSource SelectCount方法做什么

public class Users
{
    public IList<MembershipUser> GetUsers(string alpha, string search, bool byEmail, int startRowIndex, int maximumRows)
    {
        IList<MembershipUser> users = null;

        if (alpha != null && search == null)
        {
            users = Membership.GetAllUsers().Cast<MembershipUser>().Where(x => x.UserName.StartsWith(alpha) == true).ToList();
        }
        else if (search != null && !byEmail)
        {
            users = Membership.FindUsersByName(search).Cast<MembershipUser>().Skip(maximumRows * startRowIndex).Take(maximumRows).ToList();
        }
        else
        {
            users = Membership.FindUsersByEmail(search).Cast<MembershipUser>().Skip(maximumRows * startRowIndex).Take(maximumRows).ToList();
        }

        return users;

    }

    public int GetUserCount()
    {

    }
公共类用户
{
公共IList GetUsers(字符串alpha、字符串搜索、bool-byEmail、int-startRowIndex、int-maximumRows)
{
IList用户=null;
if(alpha!=null&&search==null)
{
users=Membership.GetAllUsers().Cast().Where(x=>x.UserName.StartsWith(alpha)==true.ToList();
}
else if(search!=null&&!通过电子邮件)
{
users=Membership.FindUsersByName(search.Cast().Skip(maximumRows*startRowIndex.Take(maximumRows).ToList();
}
其他的
{
users=Membership.FindUsersByEmail(search.Cast().Skip(maximumRows*startRowIndex.Take(maximumRows).ToList();
}
返回用户;
}
public int GetUserCount()
{
}
更新的C#:

public IEnumerable GetUsers(字符串alpha、字符串searchBy、字符串searchText、int startRowIndex、int maximumRows)
{
var users=Membership.GetAllUsers().Cast();
if(alpha!=null&&string.IsNullOrEmpty(searchBy))
{
用户=用户
.Where(x=>x.UserName.StartsWith(alpha,StringComparison.OrdinalIgnoreCase))
.Skip(最大行数*startRowIndex)
.Take(maximumRows.ToList();
}
else if(searchBy==“用户名”&&&!string.IsNullOrEmpty(searchText))
{
users=users.Where(x=>x.UserName==searchText)
.Skip(最大行数*startRowIndex)
.Take(maximumRows.ToList();
}
else if(searchBy==“Email”&&!string.IsNullOrEmpty(searchText))
{
用户=用户。其中(x=>x.Email==searchText)
.Skip(最大行数*startRowIndex)
.Take(maximumRows.ToList();
}
其他的
{
users=null;
}
返回用户;
}

类似于以下的方法应该可以工作:

public int GetUserCount(string alpha, string search, bool byEmail, int startRowIndex, int maximumRows)
{
    var users = Membership.GetAllUsers().Cast<MembershipUser>();

    if (alpha != null && search == null)
    {
        users = users.Where(x => x.UserName.StartsWith(alpha) == true);
    }
    else if (search != null && !byEmail)
    {
        users = users.FindUsersByName(search).Cast<MembershipUser>();
    }
    else
    {
        users = users.FindUsersByEmail(search);
    }

    return users.Count();
}
public int GetUserCount(字符串alpha、字符串搜索、bool-byEmail、int-startRowIndex、int-maximumRows)
{
var users=Membership.GetAllUsers().Cast();
if(alpha!=null&&search==null)
{
users=users.Where(x=>x.UserName.StartsWith(alpha)==true);
}
else if(search!=null&&!通过电子邮件)
{
users=users.FindUsersByName(search.Cast();
}
其他的
{
users=users.FindUsersByEmail(搜索);
}
返回users.Count();
}

如果
FindUsersByName
FindUsersByEmail
返回了与
IEnumerable
相关的对象,那么我会更愿意使用这种方法,这样您就可以依赖LINQ的懒惰特性,但在这种情况下,这并不重要,因为您正在进行计数。我建议使用某种形式的
Select
来限制字段ing查询过,但在你的后两种情况下,他们无论如何都会提取所有结果,因此在2/3的可能情况下没有任何好处。如果你发现查询通常是通过
用户名进行的,那么它可能值得添加到那里。

修复这一问题对我来说在这个社区通常是不好的词。我们可以帮助你修复你的问题问题,但我们将为您解决任何问题的期望是不好的。@M.Babcock抱歉,我下次不会这样说,但我真正的问题是当我需要进行计数时,如何确定要选择哪个计数。这听起来像是一个商业规则,您应该询问您的设计师。我们不知道您的数据,因此我们只能猜测。The data是MembershipUser,我需要通过Membership.FindUsersByName、Membership.FindUsersByEmail或Membership.GetAllUsers()传入的用户选择进行计数我能做些什么。我已经更新了我的c#,我只是继续把它变成了IEnumerable,没有看你的答案。这就是你在评论中的意思吗?我没有使用选择,我使用的是where语句一般来说,是的。在这种情况下使用
select
的好处是减少从数据库返回的字段数e(这将使它稍微更有效率)。我认为只有在第一种情况下才有好处,因为
FindUsersByName
无论如何都会返回您的整个对象。我需要的唯一字段是用户名,但当我需要删除时,它需要MembershipUser类对象,当我在ListView中对ItemDataBound执行LinkButton命令参数的DataItem时。我从来没有做过S创建匿名对象之前的elect()语句如何避免我的匿名对象出错?能否在select语句更新代码中给出一个示例
public int GetUserCount(string alpha, string search, bool byEmail, int startRowIndex, int maximumRows)
{
    var users = Membership.GetAllUsers().Cast<MembershipUser>();

    if (alpha != null && search == null)
    {
        users = users.Where(x => x.UserName.StartsWith(alpha) == true);
    }
    else if (search != null && !byEmail)
    {
        users = users.FindUsersByName(search).Cast<MembershipUser>();
    }
    else
    {
        users = users.FindUsersByEmail(search);
    }

    return users.Count();
}