使用C#泛型压缩代码

时间:2012-09-25 08:52:18

标签: c# linq generics

我有以下两种方法可以使用泛型在一种方法中压缩。我试过的东西无法编译。有人能让我知道如何做到这一点?我需要检查表AgeLengths的2个不同字段是否至少有一个值。 Str_table与AgeLengths有一对多的关系。

public static bool HasMeanWeight(int id)
{
    MyDataContext dc = new MyDataContext ();
    return  (from s in dc.Str_table 
             where s.SId == id 
             select s.AgeLengths
             .Where(a => a.MeanWeight != null ).Any() == true
            ).FirstOrDefault();
}

public static bool HasNumbersData(int id)
{
    MyDataContext dc = new MyDataContext ();
    return (from s in dc.Str_table 
            where s.sId == id 
            select s.AgeLengths
            .Where(a => a.Numbers  != null).Any() == true
           ).FirstOrDefault();
}

提前致谢 乙

2 个答案:

答案 0 :(得分:5)

更新:道歉,我没有意识到这是linq to sql。 Dennis's answer似乎已经出现了。

尝试注入Func<T, TResult>以注入不同的代码:

public static bool HasData(int id, Func<AgeLength, object> selector)
{
    MyDataContext dc = new MyDataContext ();
    return (from s in dc.Str_table 
            where s.sId == id 
            select s.AgeLengths
                .Where(a => selector(a) != null)
                .Any())
           .FirstOrDefault();
}

并且这样打电话:

HasData(1, a => a.Numbers);
HasData(1, a => a.MeanWeight);

如果NumbersMeanWeight属性位于同一继承层次结构中,那么您可以将object替换为更有用的内容,但在此实例中object可以正常你只是在测试null。

答案 1 :(得分:3)

如果您正在使用某些DataContext,那么您正在使用IQueryable<T>,而且您可以在表达式中编写的内容非常有限。因此,您需要将表达式传递给您的方法,而不是谓词本身:

static bool HasData(int id, Expression<Func<AgeLength, bool>> predicate)
{
    using (MyDataContext dc = new MyDataContext())
    {
        return (from s in dc.Str_table
                where s.sId == id
                select s.AgeLengths
                .Any(predicate)
               ).FirstOrDefault();
    }
}

此外:

  • Any重载,接受谓词表达式;
  • 必须处理
  • 上下文(请参阅using);
  • 没有必要写someBoolExpression == true;只需写下someBoolExpression

你可以像这样调用这个方法:

HasData(1, a => a.MeanWeight != null);
HasData(1, a => a => a.Numbers  != null);

注意,第二个参数是lambda表达式,而不是方法 这是因为查询的惰性:您提供了一组表达式,相应的提供程序将它们转换为适当的SQL。