我有以下两种方法可以使用泛型在一种方法中压缩。我试过的东西无法编译。有人能让我知道如何做到这一点?我需要检查表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();
}
提前致谢 乙
答案 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);
如果Numbers
和MeanWeight
属性位于同一继承层次结构中,那么您可以将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。