如果我有一个由数据库中的表表示的类
public class Foo
{
public string Bar1 {get; set;}
public string Bar2 {get; set;}
}
class DataContext : DbContext
{
public DbSet<Foo> Foos { get; set; }
}
public enum FooDataStatus {Bar1Missing, Bar2Missing, Bar1And2Missing, Complete}
public class MappedFoo
{
public string Bar1 {get; set;}
public string Bar2 {get; set;}
public FooDataStatus DataStatus ... property or method ...
}
我希望能够重用逻辑来为MappedFoo的单个实例返回FooDataStatus,并且还为iqueryables返回,这样我可以获得数据库中具有每个FooDataStatus的记录数量而不传递所有记录数据库。
int completedRecords = (From f in DataContext.Foos
....magic goes here ...
).Count(d=>d==FooDataStatus.Complete);
请注意这是我所追求的简化版本,但所有逻辑都很容易映射sql等效运算符,但复杂到重复逻辑似乎并不明智。
(From f in DataContext.Foos
where f.Bar1!=null && f.Bar1!="" && f.Bar2!=null && f.Bar2 != "").Count();
如何创建更可重用的逻辑集?
答案 0 :(得分:0)
我最终使用(我希望有关如何改进的任何提示,特别是 DataStatus get属性访问者)&gt;我很高兴在下面标注答案改进:
public class Foo : IFoo
{
public string Bar1 {get; set;}
public string Bar2 {get; set;}
}
public class MappedFoo : IFoo
{
public string Bar1 {get; set;}
public string Bar2 {get; set;}
public FooDataStatus DataStatus { get { return CalculateRecordStatusOption.Compile()(this);}}
public static Expression<Func<IFoo, FooDataStatus>> CalculateRecordStatusOption =
r =>
(r.Bar1 == null || r.Bar1 == "")
? FooDataStatus.Bar1Missing
:(r.Bar2 == null || r.Bar2 == "")
? FooDataStatus.Bar2Missing
: FooDataStatus.NoneMissing;
}
interface IFoo
{
string Bar1 {get; set;}
string Bar2 {get; set;}
}
class Program
{
static void Main()
{
using (var context = new DataContext())
{
var emptyRecordCount = context.Foos
.Select(MappedFoo.CalculateRecordStatusOption)
.Count(f=>f == FooDataStatus.NoneMissing);