3

我有以下两种方法,我可以使用泛型在一种方法中进行压缩。我尝试过的无法编译。有人可以让我知道如何做到这一点吗?我需要检查表 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();
}

在此先感谢 B

4

2 回答 2

5

更新:抱歉,我没有意识到这是 linq to sql。丹尼斯的回答似乎是对的。

尝试注入 aFunc<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。

于 2012-09-25T08:56:02.403 回答
3

如果您使用 some 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。

于 2012-09-25T09:10:43.850 回答